C++ STL中常见容器用法

记录下常用的标准库的操作。容器主要分为顺序容器和关联容器,每个大类中的容器操作都大同小异,所以分为这两大类及记录。

顺序容器

常用的顺序容器有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容器的查找。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值