记录下常用的标准库的操作。容器主要分为顺序容器和关联容器,每个大类中的容器操作都大同小异,所以分为这两大类及记录。
顺序容器
常用的顺序容器有vector, deque, list, string等(当然还有array)。
常用操作
定义和初始化
C c; //定义一个空容器。如果是array,其中的元素会进行默认初始化。
C c1(c2); //用c2来初始化c1
C c1=2; //同上
C c{a,b,c}; //用初始化列表初始化
C c={a,b,c}; //同上
C c(b,e); //b和e为迭代器,用迭代器指定的范围进行初始化。
C seq(n); //指定容器大小的初始化。array不能这么写
C seq(n,t); //用n个相同的t来初始化。array不能这么写
赋值
c1=c2;
c={a,b,c};
swap(c1,c2);
c1.swap(c2);
//assign不能用在array
seq.assign(b,e); //将seq中的元素替换为迭代器b和e所指示的范围中的元素。b和e不能指向seq中元素。
seq.assign({a,b,c}); //将seq中元素替换为初始化列表中的元素。
seq.assign(n,t); //将seq中的元素替换为n个同样的t。
插入
//vector和string没有push_front和emplace_front
c.push_back(t);
c.push_front(t);
c.emplace_back(args); //和上面两个区别是,emplace会直接用args创建一个对象再插入,上面两个是直接插入一个对象。
c.emplace_front(args);
c.insert(p,t), c.emplace(p,args); //在迭代器p所指的前面插入,返回指向新加元素的迭代器
c.insert(p,n,t); //在迭代器p所指前面插入n个t,返回指向新加的第一个元素的迭代器。
c.insert(p,b,e); //同上,只是插入的是b和e指示的范围元素。
c.insert(p,{a,b,c}); //同上,只是插入的是初始化列表中的元素。
访问
c.back(), c.front();
c[n], c.at(n); //at有越界异常检测。
删除
vector和string没有pop_front();
c.pop_back(), c.pop_front();
c.erase(p), c.erase(b,e); //删除迭代器指向的元素或b和e范围内的,并返回p和e下一个迭代器。
c.clear(); //删除所有元素
string的额外操作
初始化
string s(cp,n); //s是cp指向的数组中前n个字符的拷贝。
string s(s2,pos2); //s是string s2从下标pos2开始的字符的拷贝。
string s(s2,pos2,len2); //s是string s2从下标pos2开始len2个字符的拷贝。
s.substr(pos,n); //返回一个string,包含s中从pos开始的n个字符的拷贝。pos默认值0,n默认值s.size()-pos。
修改已有字符串
s.insert(pos,args); //在pos前插入args指定字符。pos可以是下标或迭代器。
s.erase(pos,len); //删除pos开始的len个字符,如无len就删到结束。
s.assign(args); //替换
s.append(args); //将args追加到s。
s.replace(range,args); //替换range中的字符为args。range为一个下标和一个长度,或者为两个迭代器。
args有很多形式,append和assign能用所有形式,而replace和insert会根据格式选择能用的形式,所有如下。
str 字符串
str,pos,len str从pos开始len个字
cp,len 从cp指向的字符数组的前len个字
cp 字符数组
n,c n个字符c
b,e 两个迭代器
{a,b,c} 初始化列表。
搜索
s.find(args); //args第一次出现位置
s.rfind(args); //最后一次出现位置
s.find_first_of(args); //args中任意字符第一次出现位置
s.find_last_of(args); //最后一次
s.find_first_not_of(args); //第一个不在args中的字符
s.find_last_not_of(args); //最后一个
args可以为
c,pos 从s中位置pos开始查找字符c。pos默认0
s2,pos 查找字符串s2.pos默认0
cp,pos //处理C的字符数组
cp,pos,n
s.compare(args); //和c中的strcmp相似,等于返回0,大于返回1,小于返回-1
args如下
s2
pos1,n1,s2 将s中从pos1开始的n1个字符与s2进行比较
pos1,n1,s2,pos2,n2 将s中从pos1开始的n1个字符与s2中从pos2开始的n2个字符进行比较。
数值转换
to_string(val); //可将所有算数类型转换成string
stoi(s,p,b); //还有stol, stoul, stoll, stoull, stof, stod, stold
//sto后是算术类型的简写,p用来保存第一个非数字字符的下标,b为转换基数,默认为10进制。
关联容器
这里就先简单介绍下有序关联容器,以后有时间再来补充。
map,multimap,set,multiset。map存一组关键字到值的映射,set只存关键字,这两关键字不能重复,带multi能重复。
初始化和顺序容器类似,这里记录特有的操作
特有类型:
key_type 此容器类型的关键字类型
mapped_type 每个关键字关联的类型
value_type pair<const key_type, mapped_type>,map.insert()时里面要insert这种pair。
特有操作:
set:
c.insert(v), c.insert(p,v); //从迭代器p开始搜索插入或直接交给插入函数
c.emplace(args)
c.insert(b,e); //用迭代器范围插入
c.insert({a,b}); //用初始化列表插入
c.find(k); //返回一个迭代器,指向第一个关键字为k的元素,若无k,返回尾后迭代器。
c.count(k); //返回关键字k出现次数
c.lower_bound(k); //返回第一个关键字不小于k的迭代器
c.upper_bound(k); //返回第一个关键字大于k的迭代器
c.equal_range(k); //返回一个迭代器pair,为关键字k的元素范围,可用于multi容器的查找。