一、顺序容器的定义
顺序容器 | | 容器适配器 | |
---|---|---|---|
vector | 支持快速随机访问 | stack | 后进先出(LIFO) |
list | 支持快速插入/删除 | queue | 先进先出(FIFO) |
deque | 双端队列 | priority_queue | 有优先级管理的队列 |
1、容器类型的操作集合形成了以下层次结构:
1)一些操作适用于所有容器类型;
2)另外一些操作只适用于顺序或关联容器;
3)还有一些操作只适用于顺序或关联容器类型的一个子集。
2、容器构造函数
C<T>c; | 创建一个名为c的空容器。C是容器类型名,如vector,T是元素类型,如int或string适用于所有容器 |
Cc(c2); | 创建容器c2的副本c;c和c2必须具有相同的容器类型,并存放相同类型的元素。适用于所有容器。 |
Cc(b,e); | 创建c,其元素是迭代器b和e标示的范围内元素的副本。 适用于所有容器 |
Cc(n, t); | 用n个值为t的元素创建容器c,其中值t必须是容器类型C的元素类型的值,或者是可转换为该类型的值。 只适用于顺序容器 |
Cc(n); | 创建有n个值初始化元素的容器c 只适用于顺序容器 |
3、将一个容器初始化为另一个容器的副本
将一个容器复制给另一个容器时,类型必须匹配:容器类型和元素类型都必须完全相同。
- vector<int> ivec;
- vector<int> ivec2(ivec); //OK
- vector<double> dvec(ivec); //Error
- list<int> ilist(ivec); //Error
4、初始化为一段元素的副本
系统允许通过一对迭代器间接实现不同种容器之间进行复制:使用迭代器时,不要求容器类型相同,容器内元素类型也可以不相同,只要他们相互兼容,能够将要复制的元素转换为所构建的新容器的元素类型,即可实现复制。
- vector<string> svec;
- //...
- list<string> slist(svec.begin(),svec.end()); //OK
- vector<string>::iterator mid = svec.begin() + svec.size()/2;
- deque<string> front(svec.begin(),mid); //OK
- deque<string> back(mid,svec.end()); //OK
- char *word[] = {"stately","plump","buck","mulligan"};
- list<string> slist2(word,word + sizeof(word)/sizeof(*word)); //OK
- vector<int> ivec;
- //...
- vector<double> dvec(ivec.begin(),ivec.end()); //OK
5、分配和初始化指定数目的元素
不提供元素初始化式时,标准库将为该容器实现值初始化,采用这种类型的初始化,元素类型必须是内置或复合类型,或者是提供了默认构造函数的类类型。如果元素类型没有默认构造函数,则必须显式的指定其元素初始化式。
接受容器大小做形参的构造函数只适用于顺序容器,而关联容器不支持这种初始化。
- const list<int>::size_type list_size = 64;
- list<int> ilist(list_size); //OK
- list<string> slist(list_size); //OK
- list<string> strList(list_size,"Ha~"); //OK
- //P267 习题9.2
- vector<string> strVec1;
- vector<string> strVec2(strVec1);
- vector<string> strVec3(strVec2.begin(),strVec2.end());
- vector<string> strVec4(strVec3.size());
- vector<string> strVec5(strVec4.size(),"ANS");
6、容器内元素的约束
C++语言中,大多数类型都可用作容器的元素类型。容器元素类型必须满足
以下两个约束:
•元素类型必须支持赋值运算。
•元素类型的对象必须可以复制。
容器操作的特殊要求
支持复制和赋值功能是容器元素类型的最低要求。此外,一些容器操作对元素类型还有特殊要求。如果元素类型不支持这些特殊要求,则相关的容器操作就不能执行:我们可以定义该类型的容器,但不能使用某些特定的操作。
- class Foo
- {
- public:
- Foo(int x)
- {
- }
- };
- int main()
- {
- vector<Foo> empty; //OK
- vector<Foo> bad(10); //Error
- vector<Foo> ok(10,1); //OK
- }
有在同时指定每个元素的初始化式时,才能使用给定容器大小的构造函数来创建同类型的容器对象。