STL中的容器是如何实现的,如何存储的

一、关联式容器有哪些,如何实现的。

标准的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如何实现。

priority_queue是基于max-heap实现的,所谓max-heap,是一种特殊的完全二叉树,父节点的值大于等于子节点的值。

 

注意,STL中定义的max-heap有make_heap()  push_heap()  pop_heap()  sort_heap()等操作,但其实本质上只有pop_heap()   push_heap()两大项,其余操作可看做是对这二项的封装。

 

三、priority_queue和multiset的区别,即max-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的使用!

 

四、deque是以分段连续线性空间存储的。

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的存储和实现形式已经介绍完毕。

posted @ 2013-05-22 20:52  helloweworld  阅读(587)  评论(0编辑  收藏  举报