顺序容器
顺序容器的元素排列次序与元素值无关,而是由元素添加到容器里的次序决定。
标准库定义了三种顺序容器
vector list deque
,还提供了三种容器适配器,适配器是根据原始的容器类型所提供的操作。
顺序容器 | 功能 |
---|---|
vector | 支持快速随机访问 |
list | 支持快速输入、删除 |
deque | 双端队列 |
顺序容器适配器 | 功能 |
---|---|
stack | 栈 |
queue | 队列 |
priority | 优先级管理的队列 |
顺序容器的初始化
以下伪代码的注释
C 容器类型名
c、 c1、c2… 容器名
b(begin) 、e(end) 迭代器b和e
n 整型
C<T> c; //创建一个名为c的空容器
C c(c2); //创建容器c2的副本c,c和c2必须要有同样的容器类型
C c(b,e); //创建c,其元素是迭代器b和e所表示的范围内元素的副本。
C c(n,t); //用n个值为t的元素创建容器c,其中值t必须是容器类型c的元素类型的值 只适用顺序容器
C c(n); //创建由n个值初始化元素的容器c 只适用于顺序容器
1、将一个容器初始化为另一容器的副本
要求:容器类型和元素类型相同
vector<int> ivec;
vector<int> ivec2(ivec); //ok
list<int> ilist(ivec); //error 容器类型不同
vector<double> dvec(ivec) //error 元素类型不同
2、初始化为一段元素的副本
要求: 不要求容器类型相同,元素类型也可以不同,只要能够相互兼容,能够将要复制的元素转换为所构架的容器元素的元素类型,就可以实现复制。
// svec的容器类型为 vector<string>
list<string> slist(svec.begin(), svec.end());
vector<string>::iterator mid = svec.begin() + svec.size()/2;
deque<string> front(svec.begin(), mid);
deque<string> back(mid, svec.end());
3、分配和初始化指定数目的元素
创建顺序容器时,可显式地指定容器大小和一个(可选的)元素初始化式。
容器大小可以是常量或者非常量表达式。元素初始化必须是可用于初始化其元素类型的对象的值。
const list<int>::size_type list_size = 64;
list<string> slist(list_size, "eh?"); //64个strings, 每个都是"eh?"
4、 容器内元素的约束
要做容器元素类型,要满足下面的要求
- 元素类型必须支持赋值运算
- 元素类型的对象必须可以复制
大多数类型满足上述的元素类型要求。除了引用类型外,因为引用类型不支持赋值运算。
还有就是IO库类型,IO库类型不支持复制或赋值。因此不能存放IO对象的容器。
5、 容器的容器
现在判断一下下面哪个语句有问题。
vector< vector<string> > lines; //acc
vector<vector<string>> lines; //error
必须要记住要隔开> >,如果连在一起会被以为是右移操作符。