vector 动态数组
set 集合
string 字符串
map 自定义映射
左闭右开
vector
vector<int> vi; for(int i=0;i<10;i++) vi.push_back(i);//放在最后 for(vector<int>::iterator it=vi.begin();it!=vi.end();it++) cout<<*it<<endl;
vi.begin 是第一个元素的地址(将迭代器理解为地址),end为最后一个元素的下一个元素地址
push,pop是不是暗示可以直接用来当栈用?
还有其他方法不一一举例了
vi.pop_back();
vi.size();
vi.clear();//清空
vi.insert(it,x);//想迭代器处插入元素x
vi.erase(it);
vi.erase(it_first,it_last);//左闭右开
set
默认自动去重,并按升序排序,因为用的是红黑树
另外允许重复的set有 multiset
不排序的set有 unordered_set 用的散列代替红黑树
set<int> sset; for(int i=0;i<10;i++) sset.insert(i); for(set<int>::iterator it=sset.begin();it!=sset.end();it++) { cout<<*it<<endl; }
set就不是push pop了
直接是insert函数
其他函数有
set<int>::iterator it=sset.find(value); sset.erase();//参数可以填值或者迭代器,区间删除同vector sset.size(); sset.clear();
string
c++的string可以用类似char数组的方式遍历
string sss="546456sdfa"; for(int i=0;i<sss.length();i++) cout<<sss[i];
cout cin 都是整个输入输出
还可以转换为char数组
printf("%s",sss.c_str());
string还可以用迭代器输出
for(string::iterator it=sss.begin();it!=sss.end();it++) cout<<*it;
加号可以直接拼接两个string
str3=str1+str2;
其他函数有
sss.insert(pos,string);//在sss[pos]位置上插入string sss.insert(it,it_begin,it_end);//串 [it_begin,it_end)左闭右开插入到it位置(都是迭代器) sss.erase(it); sss.erase(pos,length);//区间抹除同vector sss.clear(); sss.substr(pos,length); sss.find(string); sss.replace(pos,length,string);//sss[pos]开始,length长度的子串替换为string sss.replace(it_begin,it_end,string);//sss的迭代器it_begin,it_end左闭右开范围内的子串替换为string
map
map<char,int> mmap; mmap['a']=1; cout<<mmap['a'];
相同键的值只能有一个
for(map<char,int>::iterator it=mmap.begin();it!=mmap.end();it++) printf("%c %d ",it->first,it->second);
first是键值,second是存放的对应值,同样,map也会排序,用的也是红黑树
其他函数
mmap.find(key); mmap.erase(it); mmap.erase(key); mmap.erase(it_begin,it_end);//左闭右开 mmap.clear(); mmap.size();
如果需要一个键对应多个值,multimap,这里是不是可以用来分类,并查集?
同set一样,也有unordered_map