标准的STL中关联容器有set map multiset multimap,这四种容器都是基于红黑树实现的。
使用这些容器需要包含#include <set> #include <map>
SGI STL还提供了标准之外的以基于hash table实现的的hash_set hash_map hash_multiset hash_multimap.
使用这些容器需要包含#include <hash_set> #include <hash_map>
priority_queue是基于max-heap实现的,所谓max-heap,是一种特殊的完全二叉树,父节点的值大于等于子节点的值。
注意,STL中定义的max-heap有make_heap() push_heap() pop_heap() sort_heap()等操作,但其实本质上只有pop_heap() push_heap()两大项,其余操作可看做是对这二项的封装。
STL的max-heap是以vector形式存放的,max-heap不提供迭代器,不提供遍历,也没有删除中间某个节点的操作,为什么呢,因为STL中的heap是为实现priority_queue而定义的,而priority_queue仅提供队头队尾的操作!
priority_queue和multiset有何区别呢?区别从实现上就可以看出来,multiset的底层——特殊的二叉搜索树——红黑树,是提供遍历的,也提供删除中间某个节点的操作。而且二叉搜索树本身的有序性要强(左<根<右,而max-heap仅父节点值最大)。红黑树的存储是用parent leftchild rightchild三个指针实现的,max-heap是用vector存储的。
max-heap的push_heap()操作时通过新节点的上溯实现的。
而二叉搜索树的插入是从根节点开始比较,直到叶子节点。
max-heap的pop_heap()操作时取根节点,然后先下溯再上溯。
而二叉搜索树的删除分被删除结点的子节点数讨论。
补充:堆排序的关键是堆的构造即make_heap,及取走根节点后的上下溯,其实堆排序就是对make_heap pop_heap的使用!
vector存储是连续的线性空间,deque是分段连续的,deque采用一小块连续空间——map作为主控,map中存放的节点都是node,然后node再指向不同缓冲区。
那么deque和vector的存储区别就显而易见了,vector动态增长时,要重新开辟一块空间,将旧的内容复制到新空间。而deque动态增长时,只需让map中指针再申请一块内存(除非原来的map存储空间也用完了,则需要复制map)。
list是双向循环链表。stack 和 queue是对deque的封装。
至此,6个顺序容器——vector list deque queue stack priority_queue,4个关联式容器——set map multiset multimap的存储和实现形式已经介绍完毕。