1 C<T> c(c1);//c和c1类型必须匹配:容器类型和元素类型均相同
2 C<T> c(b,e);//初始化c为迭代器b和e范围内的副本,元素类型兼容即可
3 C<T> c(n,t);//初始化为n个t值,t与C的元素类型兼容即可,只适用于顺序容器
4 C<T> c(n);//只适用于顺序容器,T类型必须有默认构造函数或内置类型
容器的容器:
Vector<vector<string> > lines;//两个连续的>之间必须有空格
容器以及迭代器的运算
list类型迭代器既不支持算术运算,也不支持关系运算,但提供自增自减、解引用以及相等(不等)运算;
vector和deque类型的迭代器支持所有运算;
所有容器均支持关系运算(容器类型和元素类型均相同),且其关系运算取决于其元素类型定义的关系运算。
容器的迭代器失效问题:
在vector或deque容器添加或者删除元素会使迭代器失效,一般不要存储end操作返回的迭代器,例如
vector<int>::iteratorfirst=ivec.begin(),last=ivec.end();
while(first!=last)
{
first=ivec.insert(++first,42);
++first;
}
这段代码运行时会出现错误,因为采用insert向vector或者deque添加元素后会使存储在last的迭代器失效。
对vector或者deque容器使用resize()操作也有可能会使迭代器失效。
但是注意:相同的操作对list不会产生影响,即若将上述代码改为对list容器操作,程序将正常运行,不会出现错误。
对于所有的容器类型,如果用resize操作压缩了容器,则指向删除元素的迭代器都会失效。
顺序容器特点总结:
1vector容器:
内部数据结构:数组,元素连续存储;
支持快速随机访问每个元素,所需的时间为常量;
在末尾增加或者删除元素所需时间与元素数目无关(即不需要移动任何其它元素),在中间或者开头添加或者删除元素所需时间随元素数目呈线性变化(需要移动被插入或删除元素右边所有的元素);
可以动态增加或删除元素,内存管理自动完成,程序员也可以使用reserve()成员函数来管理内存,其迭代器在内存重新分配时失效,一般实际分配的容量会比当前所需的空间要多一些,来实现vector快速的内存分配,所以实际上vector比list和deque容器的增长效率通常要高;
添加元素时,若添加元素个数大于容器容量capacity(和size概念不同),则内存会重新分配,所有迭代器均失效;若容量未满,则指向当前元素以后的任何元素的迭代器均失效;
删除元素时,指向被删除元素以后的任何迭代器均失效。
2deque容器
内部数据结构:数组,结构更加复杂;
支持快速随机访问每个元素,所需的时间为常量;
在开头或末尾增加或者删除元素所需时间与元素数目无关(速度非常快),在中间添加或者删除元素所需时间随元素数目呈线性变化(代价更高);
可以动态增加或删除元素,内存管理自动完成,不提供用于内存管理的成员函数;
在开头或末尾添加元素不会使deque的任何迭代器失效,在头或尾删除元素时,只有指向该元素的迭代器失效;
在deque的中间任何位置插入或删除元素时,其迭代器都会失效。
3list容器
内部数据结构:双向环状链表,非连续存储,可以双向遍历;
支持在任意位置快速插入或删除元素且不需要移动任何其它元素,但是不支持随机访问,在list容器的元素之间移动的唯一方法是顺序跟随指针,例如若从5号元素移动道15号元素,则必须遍历它们之间所有的元素;
在任何地方增加或删除元素所需时间为常量;
可以动态增加或删除元素,内存管理自动完成(不存在容量capacity的概念);
增加任何元素都不会使迭代器失效;
删除元素时,除了指向当前被删除元素的迭代器外,其它迭代器均不会失效。
容器的赋值与swap
赋值操作c1=c2:c1和c2容器类型和元素类型必须匹配;
交换c1.swap(c2):c1和c2容器类型和元素类型必须匹配;
重置c.assign(b,e)或c.assign(n,t):只要元素类型相互兼容即可,容器类型可以不相同;
注意:赋值操作和assign操作首先删除左操作数容器的所有元素,然后重设容器内容,所以会使左操作数的迭代器失效;但是swap不会,尽管交换了元素,迭代器仍然指向相同的元素,因为swap不会插入或删除任何元素。
容器适配器
提供两种构造函数:
A a; //空适配器,名为a
A a(c);//初始化为容器c的副本
例:stack<int> stk; stack<int> stk2(vec);
关联基础容器类型:
Stack<string, vector<string> >str_stk;
Stack<string, vector<string> >str_stk1(svec);
注意: stack 可以关联任意一种基础顺序容器(默认建立在 deque 上 ); queue 适配器需要提供 push_front 操作,所以只能关联 list ,不能关联 vector ;而 priority_queue 需要支持随机访问,所以只能关联 vector 或 deque ,不能关联 list 容器。