天天看点

C++ 顺序容器的初始化顺序容器

顺序容器

顺序容器的元素排列次序与元素值无关,而是由元素添加到容器里的次序决定。

标准库定义了三种顺序容器

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
           

必须要记住要隔开> >,如果连在一起会被以为是右移操作符。