1.
容器如vector、deque、list是线性存储的,它们都是有迭代器的。
queue和stack作为容器适配器,没有迭代器的。它们默认使用deque作为底层元素。
2.
heap不属于STL容器,但是它是优先队列的幕后英雄。heap底层是vector或者array实现的。STL实现了最大堆,这样可以满足优先队列的特性。
优先队列也是容器适配器。
3.
slist是单向列表,它的迭代器也是单向的。(这和list的双向迭代器明显不同)slist每次遍历只能从头开始,在插入元素的时候不提供push_back(),只提供push_front(),这样元素的次序会和插入的次序相反。
4.红黑树
红黑树的插入操作主要包括:insert_unique()和insert_equal()。
5.
map是键值对,不允许有重复的键值。会按照元素的键值自动升序。map底层容器也是RB-tree实现的,所以其插入删除操作不会引起迭代器失效。
multimap不支持下标运算,而map支持。当删除一个元素时,使用key值做参数会删除相关key值的所有记录并返回行数。
使用find和count可以分别返回某一键值的第一个位置和个数。
m.lower_bound(k) 返回一个迭代器,指向键不小于k的第一个元素。
m.upper_bound(k) 返回一个迭代器,指向键大于k的第一个元素。
m.equal_range(k) 它的first成员等价于m.lower_bound(k),second成员等价于m.upper_bound(k)。
可用通过调用equal_range函数来取代调用upper_bound和lower_bound函数。equal_range函数返回存储一对迭代器的pair对象。如果该值存在,则pair对象中的第一个迭代器指向该键关联的第一个实例,第二个迭代器指向该键关联的最后一个实例的下一位置。如果找不到匹配的元素,则pair对象中的两个迭代器都将指向此键应该插入的位置。
<span style="font-size:18px;">pair<authors_it,authors_it> pos = authors.equal_range(searchVal); while (pos.first != pos.second) { cout << pos.first -> second << endl; ++ pos.first; } </span>
set是集合,不允许有重复的值。底层实现是RB-tree。想要判断一个值是否存在,使用set最为合适。
6.hashtable
hashtable无法处理未定义类型的元素,除非用户自己定义hash函数。
hash_set是以hashtable为底层实现的,set能实现自动排序,而hash_set不会。
hash_map、hash_multiset、hash_multimap
STL的所有关联容器都拥有自动排序功能(以为底层的RB-tree是自动排序的)因此,不需要使用sort算法。
顺序容器中stack、queue、priority-queue都有特定的入口和出口,不允许用户对元素排序。剩下的vector、deque、list,其中vector、deque适合使用sort算法,因为其迭代器属于RandomAccessIterators。而list迭代器是Bidirectionalterators,slist属于ForwardIterators,都不适合sort算法;list、slist排序,应该使用它们自己提供的成员函数sort()。
SGI STL sort算法的思想:数据量大采用快速排序,分段排序;一旦分段后的数量小于某个门槛,为了避免快速排序的递归调用带来过大的额外负荷,改用插入排序;如果递归层次过深,还会改用堆排序。