目录
顺序容器
介绍
项目 | 介绍 |
---|---|
vector | 可变数组(建议)(auto) |
deque | 队列 (操作略) |
list | 双向链表(建议)(auto) |
forward_list | 单向链表 |
array | 固定数组 |
string | 可变 |
一般操作
-
类别名
- iterator
- const_iterator
- size_type
- different_type : 两个迭代器之间的距离
- value_type : 元素类型
- reverse_iterator: 按照逆序的迭代器
初始化
一般容器
项目 | Value |
---|---|
C c | |
C c1(c2) | |
C c1=c2 | |
C c{a,b,c,d…} | |
C c={a,b,c,d…} | |
C c(b,e) | 迭代器指定的范围 [begin,end) |
C seq(n) | 包含了n个元素,并进行了初始化,string不可用 |
C seq(n,t) | 包含 了n个初始化为t的元素 |
array
必须指定类型和大小,类型和数量一致可以直接赋值
array<int,10>
array<int,10>::size_type i;
赋值和swap
assgin:替换
项目 | Value |
---|---|
seq.assign(b,e) | [begin,end) |
seq.assign(il) | 全替换为il |
seq.assign(n,t) | 替换为n个值为t的元素,原来有n-1个元素也无事 |
不适合关联容器(按照键值进行保存和访问)以及array。
swap:交换
项目 | Value |
---|---|
swap(a,b) | |
a.swap(b) |
关系运算符
1.数量相等比数值。
2.数量不等比数值,之后再比数量。
添加元素
list<int> a{1,2,3,4,5,6,7};
auto t=a.insert(a.begin(),3,9);
cout<<*t<<endl;
cout<<*(++t)<<endl;
return 0;
结果,返回的是最新一个添加的元素位置,即最左边的
vector和string
项目 | Value |
---|---|
c.push_back(t) | t必须和c类型一致 |
c.emplace_back(arg) | 会调用构造函数,class C c.emplace_back(“hello”),会自动调用class c相应的构造函数 |
c.insert(p,t) | 指定p位置之前插入t,返回的是第一个新加入元素的迭代器 |
c.emplace(p,args) | |
c.insert(p,n,t) | p之前n个t |
c.insert(p,b,e) | |
c.insert(p,il) | il是花括号包围得到元素值序列 |
c.front() | 首元素 |
c.back() | 尾元素 |
list
项目 | Value |
---|---|
c.push_back(t) | t必须和c类型一致 |
c.emplace_back(arg) | 会调用构造函数,class C c.emplace_back(“hello”),会自动调用class c相应的构造函数 |
c.push_front(t) | 将元素插到头部 (头插法) |
c.emplace_front(arg) | |
c.insert(p,t) | 指定p位置之前插入t,返回的是第一个新加入元素的迭代器 |
c.emplace(p,args) | |
c.insert(p,n,t) | p之前n个t |
c.insert(p,b,e) | |
c.insert(p,il) | il是花括号包围得到元素值序列 |
c.front() | 首元素 |
c.back() | 尾元素 |
forward_list
项目 | Value |
---|---|
a.before_begin() | |
a.cbefore_begin() | |
a.insert_after(p,t) | 返回指向最后一个插入元素的迭代器,下同 |
a.insert_after(p,n,t) | 在p之后插入n个t |
a.insert_after(p,b,e) | 范围为空,返回p,下同 |
a.insert_after(p,il) | il是花括号包围得到元素值序列, |
emplace_after(p,args) | |
a.erase_after§ | 删除p之后元素 |
a.erase_after(b,e) | 删除范围(b,e),不包括b不包括e |
c.front() | 首元素 |
访问
项目 | Value |
---|---|
c.begin() , c.end(); | $都能使用迭代器 |
c.at() | string,vector,deque,array访问失败抛出out_of_range异常 |
auto &c=a.begin() | 引用修改 |
删除
vector和string
项目 | Value |
---|---|
c.pop_back() | 最后一个 |
c.erase§ | 返回被删除元素之后的元素迭代器 |
c.erase(b,e) | 删除[begin,end) |
c.clear() |
list
项目 | Value |
---|---|
c.pop_back() | |
c.pop_front() | |
c.erase§ | |
c.clear() |
非单向链表删除代码
for(vector<int>::iterator iter = ivec.begin();iter != ivec.end();){
if((*iter) %2 == 0)
iter = ivec.erase(iter);
else
iter++;
}
单向链表删除代码
其实还是要保存前一位的位置
forward_list<int> list_1={1,2,3,4,5,6,7,8,9};
auto bb=list_1.before_begin();
auto b=list_1.begin();
while(b!=list_1.end()){
if(*b%2){
cout<<"delet "<<*b<<endl;
b=list_1.erase_after(bb);
}
else {
bb=b;
++b;
}
}
cout<<"after:"<<endl;
for(auto it: list_1)
cout<<it<<endl;
结果
改变容器大小
如果当前容器大小大于resize大小,容器后面的数据会被删除,注意迭代器失效
项目 | Value |
---|---|
list< int > list(10,42) | 10个42 |
list.resize(15) | 追加5个0 |
list.resize(25,-1) | 追加10个-1 |
ist.resize(5) | 删除后20个 |
代码
删除偶数复制奇数
在确定的位置之前插入
vector<int> l={1,2,3,4,5,6,7,8,9};
auto it = l.begin();
while (it!=l.end())
{
if(*it%2){
it = l.insert(it,*it);
it = it+2; //注意此处,insert在it之前插入,并且要跳过当前处理的值
}
else it=l.erase(it);
}
cout<<"after:"<<endl;
for(auto it: l)
cout<<it<<endl;
结果
在确定的位置之后插入
在每一个值之后插入42
vector<int> l={1,2,3,4,5,6,7,8,9};
auto it = l.begin();
while (it!=l.end())
{
++it;
it = l.insert(it,42);
++it;
}
cout<<"after:"<<endl;
for(auto it: l)
cout<<it<<endl;
结果
管理容量
都不一定能退回内存空间
项目 | Value |
---|---|
c.shringk_to_fit | vector string deque 将capacityj减少至==size() |
c.capacity() | vector string 不重新分配内存时的最大容量 |
c.reserve(n) | vector string 分配至少容纳n个元素的内存空间 |
string的额外操作
string的添加删除修改
超出范围会扔out_of_range
项目 | Value |
---|---|
string s(cp,n) | cp前n个 |
string s(s2,pos2) | 从s2下标pos2开始拷贝 |
string s(s2,pos2,len2) | 从s2下标pos2开始拷贝长为len2 |
s.substr(pos,n) | 返回一个string 从s的pos开始n个字符拷贝 |
s.inster(s.size(),5,’!’) | 末尾插入5个! |
s.erase(s.size()-5,5) | 删除后5个 |
s.insert(pos,n,c) | 在下标 pos 的元素之前插入 n 个字符 c |
s.insert(pos,s2) | 在下标 pos 的元素之前插入 string 对象 s2 |
s.insert(pos,s2,pos2,len) | 在下标为 pos 的元素之前插入 s2 中从下标 pos2 开始的 len 个字符 |
s.insert(pos,cp,len) | /在下标为 pos 打元素之前插入 cp 所指向数组的前len 个字符 |
s.insert(pos,cp) | 在下标为 pos 的元素之前插入 cp 所指向的以空字符结束的字符串副本 |
s.assign(s2) | 用 s2 的副本替换 s |
s.assign(s2,pos2,len) | 用 s2 中从下标 pos2 开始的 len 个字符替换 s |
s.assign(cp,len) | 用 cp 所指向数组的前 len 个字符副本替换 s |
s.assign(cp) | 用 cp 所指向的以空字符结束的字符串替换 s |
s.erase(pos,len) | 删除从下标 pos 开始的 len 个字符 |
string的查找
项目 | Value |
---|---|
s.find( args) | 在 s 中查找 args 的第一次出现 |
s.rfind( args) | 在 s 中查找 args 的最后一次出现 |
s.find_first_of( args) | 在 s 中查找 args 的任意字符的第一次出现 |
s.find_last_of( args) | 在 s 中查找 args 的任意字符的最后一次出现 |
s.find_first_not_of( args) | 在 s 中查找第一个不属于 args 的字符 |
s.find_last_not_of( args) | 在 s 中查找最后一个不属于 args 的字符 |
例如
string numbers("0123456789"),name("r2d2");
name.find_first_of(numbers)
输出为1,即name中第一个出现在numbers中的字符位置
字符串匹配
指定搜索位置,从pos开始
string::size_type pos=0;
while(pos=name.find_first_of(number,pos)!=string::npos){
cout<<"find string "<<pos<<end;
++pos;
}
string转数值
项目 | Value |
---|---|
to_string(val) | 把val转换成string |
stoi(s,p,b) | 把字符串s从p开始转换成b进制的int |
stol(s,p,b) | 把字符串s从p开始转换成b进制的long |
stoul(s,p,b) | 把字符串s从p开始转换成b进制的unsigned long |
stoll(s,p,b) | 把字符串s从p开始转换成b进制的long long |
stoull(s,p,b) | 把字符串s从p开始转换成b进制的unsigned long long |
stof(s,p) | 把字符串s从p开始转换成float |
stod(s,p) | 把字符串s从p开始转换成double |
stold(s,p) | 把字符串s从p开始转换成long double |
把混合字符串转数字
string ss = "pi = 3.14";
auto d = stod(ss.substr(ss.find_first_of("+-.0123456789")));
cout<<d<<endl;
结果
数字转字符串
double a = 123.32;
string res;
stringstream ss;
ss << a;
ss >> res;//或者 res = ss.str();