1.vector
相当于动态数组
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
vector<int> v;
v.push_back(2);//将2添加到尾部并且尾部扩张1
v.push_back(7);
v[1]=5;//不扩张尾部;可能报错
v.push_back(9);
v.insert(v.begin(),8);//在v.begin()前面插入
v.insert(v.end(),10);
v.erase(v.begin(),v.begin()+2);//删除区间内的值
//v.clear();//删除所有元素
reverse(v.begin(),v.end());//反向排列
sort(v.begin(),v.end());//自带排序
vector<int>::iterator it;
for(it=v.begin();it<v.end();it++) cout<<*it<<" ";//迭代器访问元素
cout<<endl;
if(!v.empty()) cout<<v.size()<<endl;//size返回元素个数,empty返回是否为空
return 0;
}
2.string
常用的字符串处理
#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
string s;
s="hello,c++stl";//赋值
cout<<s<<endl;
char ss[5000];
scanf("%s",&ss);
s=ss;//将整个字符数组赋值给string对象
cout<<s<<endl;
s=s+" hiahia";//在尾部添加字符方法1
cout<<s<<endl;
s.append("hia");//在尾部添加字符方法2
cout<<s<<endl;
string::iterator it;
it=s.begin();
s.insert(it,'5');//在迭代器位置之前插入一个字符
cout<<s<<endl;
cout<<s[5]<<endl;//下标访问元素
s.erase(it,it+2);//删除0~2的元素
s.erase(it+3);//删除第三个元素
if(!s.empty()) cout<<s.length()<<endl;//若字符串不空则输出字符串长度
s.replace(3,3,"good");//从第三个字符开始将连续的三个字符替换为“good”
cout<<s<<endl;
cout<<s.find("hia")<<endl;//返回子串的第一个下标值
cout<<s.compare("sjh")<<endl;//s和“sjh”比较:大返回1;相等返回0;小返回-1
reverse(s.begin(),s.end());//反转迭代器指向的一段区间
cout<<s<<endl;
vector<string> v;//string对象作为vector的元素
v.push_back("Tom&Jerry");
string x;
x="123545";
int sum=0;
for(int i=0;i<x.length();i++)//在ACM中常常将要读入的数当成字符串来处理
{
if(x[i]=='0') sum+=0;
else if(x[i]=='1') sum+=1;
else if(x[i]=='2') sum+=2;
else if(x[i]=='3') sum+=3;
else if(x[i]=='4') sum+=4;
else if(x[i]=='5') sum+=5;
else if(x[i]=='6') sum+=6;
else if(x[i]=='7') sum+=7;
else if(x[i]=='8') sum+=8;
else if(x[i]=='9') sum+=9;
}
cout<<sum<<endl;
string s1,s2,s3;
char sa[100],sb[100],sc[100];
sscanf("abc 123 pc","%s %s %s",sa,sb,sc);//sscanf函数可以把一个字符串按你需要的方式分离出子串
s1=sa;
s2=sb;
s3=sc;
cout<<s1<<" "<<s2<<" "<<s3<<endl;
return 0;
}
3.priority_queue
优先队列,基本的queue的操作基本包括在里面,stack的操作和queue差不多而且不是很常用
#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
void basic() //元素的比较规则默认为按元素的值由大到小排序
{
priority_queue<int> pq1;
pq1.push(1);
pq1.push(3);
pq1.push(9);
pq1.push(7);
cout<<pq1.size()<<endl;
while( !pq1.empty() )
{
cout<<pq1.top()<<" ";
pq1.pop();
}
cout<<endl;
}
struct Info //在结构体中重载 < 运算符
{
string name;
double score;
bool operator < (const Info &a) const //按score从小到大排列
{
return a.score<score;
}
};
void chongzai1() //重载 < 操作符,指定优先规则
{
priority_queue<Info> pq2;
Info info;
info.name="Jack";
info.score=68.5;
pq2.push(info);
info.name="Tom";
info.score=77.5;
pq2.push(info);
info.name="Jerry";
info.score=90;
pq2.push(info);
while( !pq2.empty() )
{
cout<<pq2.top().name<<" : "<<pq2.top().score<<endl;
pq2.pop();
}
}
struct myComp //重载 () 运算符
{
bool operator() (const int &a,const int &b)
{
return a>b; //由小到大排列
}
};
void chongzai2()
{
priority_queue<int,vector<int>,myComp> pq3;
pq3.push(1);
pq3.push(5);
pq3.push(3);
pq3.push(20);
pq3.push(8);
cout<<pq3.size()<<endl;
while( !pq3.empty() )
{
cout<<pq3.top()<<" ";
pq3.pop();
}
cout<<endl;
}
int main()
{
basic();
cout<<endl;
chongzai1();
cout<<endl;
chongzai2();
}
4.map
map是一种映射关系,一对一,第一个为关键字(first),第二个为键值(second),关键字唯一,map中的元素按关键字有序
#include<iostream>
#include<cstdio>
#include<map>
using namespace std;
void chuangjian()
{
map<string,double> m1;
m1["Jack"]=98.5; //插入元素按照键值从大到小放入红黑树
m1["Bomi"]=96;
m1["Kate"]=97.5;
map<string,double>::iterator it1;
for(it1=m1.begin();it1!=m1.end();it1++) cout<<(*it1).first<<" : "<<(*it1).second<<endl;
cout<<endl;
}
void shanchu()
{
map<int,char> m2;
m2[25]='m';
m2[28]='k';
m2[10]='x';
m2[30]='a';
m2.erase(28); //删除键值为28的元素
map<int,char>::iterator it2;
for(it2=m2.begin();it2!=m2.end();it2++) cout<<(*it2).first<<" : "<<(*it2).second<<endl;
cout<<endl;
}
void fanbianli()
{
map<int,char> m3;
m3[20]='o';
m3[28]='o';
m3[29]='o';
m3[30]='y';
map<int,char>::reverse_iterator it3; //反向迭代器
for(it3=m3.rbegin();it3!=m3.rend();it3++) cout<<(*it3).first<<" : "<<(*it3).second<<endl;
cout<<endl;
}
void yingshe()
{
map<char,int> m4;
for(int i=0;i<10;i++) m4[i+'0']=i; //字符映射数字(若需数字映射字符就换成m4[i]=i+'0';)
string s="56565";
int sum=0;
for(int i=0;i<s.length();i++) sum+=m4[s[i]];
cout<<"sum = "<<sum<<endl;
}
int main()
{
chuangjian();
shanchu();
fanbianli();
//元素的搜索和自定义比较函数和set基本一致,见文件“set1.cpp”
yingshe();
//multimap则是可以重复插入,基本与multiset差不多
//删除和查找一样看前面
return 0;
}
5.set
set是一种排序树,默认从小到大排序,底层是红黑树实现的
#include<bits/stdc++.h>
#include<set> //包含set和multiset两种容器的定义
using namespace std;
set<int> s;
set<int>::iterator it; //前向迭代器
set<int>::reverse_iterator rit; //反向迭代器
void charu()
{
s.insert(8);
s.insert(1);
s.insert(12);
s.insert(6);
s.insert(8);//重复插入,直接忽略
for(it=s.begin();it!=s.end();it++) cout<<*it<<" "; //中序遍历集合中所有元素
cout<<endl;
}
void fanbianli()
{
s.insert(5);
s.insert(55);
s.insert(555);
s.insert(6);
s.insert(8);//上面函数已经插入过的都算重复插入,直接忽略
for(rit=s.rbegin();rit!=s.rend();rit++) cout<<*rit<<" "; //反向遍历集合中所有元素
cout<<endl;
}
void shanchu()
{
s.erase(6); //删除的对象可以是某个迭代器位置上的元素,等于某个键值的元素,一个区间上的元素
it=s.begin();
s.erase(*it);
for(rit=s.rbegin();rit!=s.rend();rit++) cout<<*rit<<" "; //反向遍历集合中所有元素
cout<<endl;
}
void jiansuo()
{
it=s.find(25);
if(it!=s.end()) cout<<*it<<endl;
else cout<<"not find it"<<endl;
}
struct mycomp //方法一:自定义比较函数,重载()操作符,集合会根据比较函数将元素放入。如果没有指定则默认从小到大
{
bool operator () (const int &a,const int &b)
{
if(a!=b) return a>b;
else return a>b; //书上这样写,但是似乎直接return a>b;也可以
}
};
void bijiaoqi_1()
{
set<int,mycomp> s1;
set<int,mycomp>::iterator it1;
s1.insert(5);
s1.insert(55);
s1.insert(555);
for(it1=s1.begin();it1!=s1.end();it1++) cout<<*it1<<" "; //中序遍历集合中所有元素
cout<<endl;
}
struct Info //方法二:元素是结构体的时候,直接将比较函数写在结构体里
{
string name;
double score;
bool operator < (const Info &a) const
{
return a.score<score; //按从大到小排列
}
};
void bijiaoqi_2()
{
set<Info> s2;
Info student;
student.name="Jack";
student.score=80.5;
s2.insert(student);
student.name="Tomi";
student.score=60;
s2.insert(student);
student.name="Nacy";
student.score=66;
s2.insert(student);
set<Info>::iterator it2;
for(it2=s2.begin();it2!=s2.end();it2++) cout<<(*it2).name<<" : "<<(*it2).score<<endl; //中序遍历集合中所有元素
}
//multiset多重集合容器
multiset<string> ms;
multiset<string>::iterator mit;
void charu_multi()
{
ms.insert("abc");
ms.insert("123");
ms.insert("yoooo");
ms.insert("abc"); //允许重复插入
for(mit=ms.begin();mit!=ms.end();mit++) cout<<*mit<<endl;
}
void shanchu_multi()
{
cout<<"Total_deleted : "<<ms.erase("abc")<<endl; //删除指定键值的所有元素并返回删除的个数
for(mit=ms.begin();mit!=ms.end();mit++) cout<<*mit<<endl;
}
void jiansuo_multi()
{
mit=ms.find("yoooo"); //查找元素并返回其迭代器位置(如果存在重复元素,则返回第一个的位置),如果没找到则返回end()迭代器
if(mit!=ms.end()) cout<<*mit<<endl;
else cout<<"not find it"<<endl;
}
void qingchu()
{
s.clear();
ms.clear();
}
int main()
{
//set
charu();
fanbianli();
shanchu();
jiansuo();
bijiaoqi_1();
bijiaoqi_2();
//multiset允许重复元素键值插入
charu_multi();
shanchu_multi();
jiansuo_multi();
qingchu();
return 0;
}
6.sort
常用的排序函数,头文件是algorithm
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<climits>
#include<iomanip>
using namespace std;
bool cmp(int const a,int const b)
{
return a>b;
}
int main()
{
int a[]={1,5,4,6,3};
//sort默认从小到大排序,采用快速排序,第一个参数是要排序的区间首地址,第二个参数是区间尾地址
sort(a,a+5);
for(int i=0;i<5;i++) cout<<a[i]<<" ";
cout<<endl;
//也可以自己写一个比较函数放在第三个参数的位置,这里是从大到小
sort(a,a+5,cmp);
for(int i=0;i<5;i++) cout<<a[i]<<" ";
cout<<endl;
return 0;
}