STL顺序容器概览
1.容器定义和初始化
//For example
vector<int>a;//空
vector<int>b(a); //b是a的拷贝
vector<int>c = b; //与上一行等价
vector<int>d{ 1,2,3,4,5 };//列表初始化
vector<int>e{ 1,2,3,4,5 };//与上一行等价
vector<int>f(b.begin()+1, b.end());
//从b第二个开始到最后一个元素复制到f
array<int,5> a1; //数组具有固定大小
array<int,5> a2={1,2,3,4,5} ;
array<int,5> a3={1} ; //剩余元素为0
注意:不能对内置数组进行拷贝或对象赋值操作
//For example
int a[5]={1,2,3,4,5};
int b[5]=a; //错误,内置数组不支持
array<int,5> a={1,2,3,4,5};
array<int,5> b=a; //正确
2.赋值和交换操作
//For example
vector<int>a = { 1,2,3 };
vector<int>b = { 4,5,6 };
b = a;
b = { 1,2,3 };
swap(a, b); //a b互换
assign操作(仅支持顺序容器):
赋值运算符要求两侧必须为相同的类型,而assign允许从一个不同但相容的类型赋值,或者从容器的一个子序列赋值。
参数所指定的元素替换左边容器中的所有元素
//For example
list<string>names;
vector<const char*> oldstyle;
names=oldstyle; //错误,容器类型不匹配
names.assign(oldstyle.cbegin(),oldstyle.cend());
//正确,const char* 可以转换为string
3.容器大小操作
除了forward_list,每个容器类型都有三个与大小相关的而操作:
- 成员函数size: 返回容器中元素的数目
- 成员函数empty: 当size为 0 时返回 bool 值 true
- 成员函数max_size: 返回一个大于或等于该类型容器所能容纳的最大元素数的值
4.关系运算符
每个容器类型都支持: 相等运算符(== !=)
除无序关联容器外都支持: 关系运算符(> >= < <=)
关系运算符两边必须是相同类型的容器,且必须保存相同类型的元素
例如:vector<int>
只能与vector<int>
比较
比较规则:
两个容器每个元素逐对比较,与string的关系运算相似。
- 两个容器大小、元素都相等,则两者相等
- 两个容器大小不同,较小容器中的每个元素都等于较大容器中对应元素,则较小容器小于较大容器
- 两个容器都不是另一个容器的前缀子序列,比较结果取决于第一个不相等元素的比较结果。
vector<int> v1={1,3,5,7,9,12};
vector<int> v2={1,3,9};
vector<int> v3={1,3,5,7};
vector<int> v4={1,3,5,7,9,12};
v1<v2 //true 情况3
v1<v3 //false 情况2
v1==v4 //true 情况1
v1==v2 //false 情况1
顺序容器操作
1.添加或插入元素(array
,forward_list
除外)
emplace_front
,emplace
和emplace_back
这三个操作分别对应push_front
,insert
,push_back
.
区别在于emplace
将参数传递到元素类型的构造函数, 而不是传递对象
2.访问操作
- 注意:
.front()
和.back()
直接访问首尾元素(闭区间)而.begin()
和.end()
是左闭右开区间(即.end()-1==.back()
)
3.删除操作(除array
forward_list
)
4. forward_list
的操作
.before_begin()
称为首前迭代器
5.改变容器大小
6.容器操作可能使迭代器失效
本文截图来自 C++ Primer(第5版)中文版
ISBN 978-7-121-15535-2