并不完全,更多的图表和内容请参考原书标记部分。
顺序容器
顺序容器:
vector -- 支持快速随机访问
list -- 支持快速插入删除
deque -- 双端队列
顺序容器适配器:
stack -- 后进先出栈
queue -- 先进先出队列
priority_queue -- 有优先级管理的队列
容器内元素的类型约束:
1。元素类型必须支持赋值运算
2。元素类型的对象必须可以复制
(引用不支持一般意义的赋值运算,所以没有元素是引用类型的元素。 IO类型库不支持复制或赋值。因此也不能创建存放IO类型的对象的容器)
容器的容器
可以定义元素使容器类型的容器。如;
vector< vector<string> > lines;
迭代器(iterator)
相对于vector和deque, list容器的迭代器既不支持算术运算(加法或减法),也不支持关系运算(<=, <, >=, >),它只提供前置和后置的的自增,自荐运算以及相等(不等)运算。
9.3 顺序容器的操作
在顺序容器中添加成员。
所有顺序容器都支持push_back(t),在容器尾添加元素t,返回void型。
list和deque容器还支持push_front(t),返回void
在指定位置添加元素,可以用Insert(p,t),在迭代器p前插入元素t,返回指向新添加元素的迭代器。
还有inset(p,n,t), insert(p,b,e)等,返回void。
容器元素都是副本,在容器中添加元素时,系统是将元素之复制在容器里的。添加好后,容器中值与被复制的原址互不影响。
添加元素可能使迭代器失效
任何Insert或者push操作都可能导致迭代器失效,当编写循环将元素插入到vector或deque容器中是,程序必须确保迭代器在每次循环后都得到更新。
避免存储end操作返回的迭代器
假设所有迭代器失效是最安全的做法。这个建议特别适用于由end操作返回的迭代器。在容器的任何位置插入任何元素都会使该迭代器失效:该迭代器既没有指向容器的元素,也不再指向容器中的超出末端的下一个位置。
最好是每次做完插入运算后重新计算end迭代器:
while(first != v.end() ) {
// do some processing
first = v.insert( first, 42 );
++first;
}
关系操作符
所有容器类型都支持用关系操作符来实现两个容器的比较。比较的容器必须具有相同的容器类型,而且其元素类型也必须相同。
使用元素提供的关系操作符实现容器的关系运算 (若存储的元素类型没有定义关系运算,则存储该种元素的容器不能比较);
如果两个容器都不是对方的初始子序列,则它们的比较结果取决于所比较的第一个不相等的元素。
容器大小的操作
c.size(), c.max_size(), c.empty(), c.resize(n),
c.resize(n, t) -- 调整容器c的大小,使其能容纳n个元素,所有新添加的元素之都是t。
resize操作可能会使迭代器失效。在vector或deque容器上座resize从阿左可能会使其所有的迭代器都失效。
对于所有容器类型,如果resize操作压缩了容器,则指向已删除的元素的迭代器失效。
访问元素
front和back成员将返回容器第一个或最后一个元素的引用。
对于vector和deque容器,还有 c[n] 和 c.at[n];
在调用front或者back函数之前,或者在对begin和end返回的迭代器进行解引用运算之前,必须保证该容器非空。
使用越界的下标,或者调用空容器的front或back函数,都会导致程序出现严重的错误。
而对于at成员,若给出的下标无效,at函数将会抛出out_of_range异常。
删除元素
c.erase(p); -- 删除迭代器p所指向的元素。返回被删除元素的下一个元素。如果p指向最后一个元素,则返回超出末端的下一个位置的迭代器。如果p本身就是指向超出末端的下一位置的迭代器,则该函数未定义。
c.erase(b,e); --删除迭代器b和e所标记的范围内的所有元素。返回一个迭代器,指向被删除元素段后面的元素。如果e本身就是指向超出末端的下一个位置的迭代器,那么返回的迭代器也是指向容器超出末端的下一个位置。
c.clear(); --删除容器c内所有的元素。返回void;
c.pop_back(); -- 删除容器c的最后一个元素,返回void;若c为空容器,则该函数未定义;
c.pop_front(); --删除容器c的第一个元素,返回void;若c为空容器,则该函数未定义;只适用于list或deque容器。
*pop_front(),通常与front()操作配套使用,实现以栈的方式处理容器:
while ( !ilist.empty() _ {
process( ilist.front() );
ilist.pop_front();
}