标准STL序列容器:vector、string、deque、list
标准STL关联容器:map、set、multimap、multiset
非标准序列容器:slist和rope。slist是一个单向链表,rope本质上是一个重型字符串。
非标准关联容器:hash_set、hash_multiset、hash_map、hast_multimap
非标准散列容器:unordered_set、unordered_multiset、unordered_map、unordered_multimap
* 容器选择指导方案:vector是一种默认使用的序列类型,当很频繁地对序列中部分进行插入和删除操作时应该使用list,当大部分插入和删除发生在序列的头或尾时可以选择
deque这种数据结构。
# 连续内存容器(也叫做基于数组的容器)在一个或多个(动态分配)的内存块中保存它们的元素。如果一个新元素被查入或者已存元素被删除,其他在同一个内存块的元素就必
须向上或者向下移动来为新元素提供空间或者填充原来被删除的元素所占的空间。这种移动影响了效率(参见条款5和14)和异常安全(就像我们将会看到的)。标准的连续内存
容器是vector、string和deque。
标准的内存相邻都提供随机访问迭代器。序列容器支持push_front或push_back,但关联容器不支持。
# 基于节点的容器在每个内存块(动态分配)中只保存一个元素。容器元素的插入或删除只影响指向节点的指针,而不是节点自己的内容。所以当有东西插入或删除时,元素值不
需要移动。
表现为链表的容器——比如list和slist——是基于节点的,所有的标准关联容器也是(它们的典型实现是平衡树)。标准的基于节点的容器都提供双向迭代器。关联容器提供对
数时间复杂度的lower_bound、upper_bound和equal_range成员函数,但序列容器却没有。
4、用empty()来代替检测size()是否为0
:对于所有的标准容器,empty是一个常数时间的操作,但对于一些list实现,size花费线性时间。
5、
6、
* 一个使拷贝更高效、正确而且对分割问题免疫的简单的方式是建立指针的容器而不是对象的容器。
7、当使用new得指针的容器时, 记得在销毁容器前delete那些指针。
8、永不建立auto_ptr的容器
9、去除一个容器中有特定值的所有对象:如果容器是vector、string或deque,使用erase-remove惯用法。如果容器是list,使用list::remove。如果容器是标准关联容器,使用
它的erase成员函数。
去除一个容器中满足一个特定判定式的所有对象:如果容器是vector、string或deque,使用erase-remove_if惯用法。
如果容器是list,使用list::remove_if。如果容器是标准关联容器,使用remove_copy_if和swap,或写一个循环来遍历容器元素,当你把迭代器传给erase时记得后置递增它。
* 对于关联容器(如map, set, multimap,multiset),删除当前的iterator,仅仅会使当前的iterator失效,只要在erase时,递增当前iterator即可。这是因为map之类的容器
,使用了红黑树来实现,插入、删除一个结点不会对其他结点造成影响。
12、对STL容器线程安全性的期待现实一些
vector和string
13、尽量使用vector和string来代替动态分配的数组
14、使用reserve来避免不必要的重新分配、
15、
16、
17、使用“交换技巧”来修整过剩容量,怎么修整你的竞争者vector过剩容量的方法:vector<Contestant>(contestants).swap(contestants);
表达式vector<Contestant>(contestants)建立一个临时vector,它是contestants的一份拷贝:vector的拷贝构造函数做了这个工作。但是,vector的拷贝构造函数只分配拷贝的
元素需要的内存,所以这个临时vector没有多余的容量。
18、避免使用vector<bool>,做为一个STL容器,vector<bool>确实只有两个问题。第一,它不是一个STL容器。第二,它并不容纳bool。
19、了解相等和等价的区别
20、为指针的关联容器指定比较类型
21、永远让比较函数对相等的值返回false
关联容器:
为指针的关联容器指定比较类型
如 set 指定比较仿函数:: set<T*> ssp; 是这个的简写:set<T*, less<T*> > ssp;
22、避免原地修改set和multiset
23、
24、
25、
26、尽量用iterator代替const_iterator,reverse_iterator和const_reverse_iterator
27、用distance和advance把const_iterator转化成iterator
28、
29、需要一个一个字符输入时考虑使用istreambuf_iterator
30、
31、
32、
33、
34、注意哪个算法需要有序区间
:binary_search lower_bound upper_bound equal_range set_union set_intersection
set_difference set_symmetric_difference merge inplace_merge includes
35、通过mismatch或lexicographical比较实现简单的忽略大小写字符串比较
36、
37、用accumulate或for_each来统计区间
38、
39、
40、
41、了解使用ptr_fun、mem_fun和mem_fun_ref的原因
42、
43、
44、
45、注意count、find、binary_search、lower_bound、upper_bound和equal_range的区别
46、考虑使用函数对象代替函数作算法的参数
47、
48、
49、
50、
● SGI STL网站,http://www.sgi.com/tech/stl/。
● STLport网站,http://www.stlport.org/。
● Boost网站,http://www.boost.org/。