zoukankan      html  css  js  c++  java
  • 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的存储和实现形式已经介绍完毕。

  • 相关阅读:
    使用iframe从网页调起移动端应用
    综合练习:词频统计
    组合数据类型练习
    python 绘制五星红旗
    熟悉常用的Linux操作
    大数据概述
    windowBackground打造闪屏页
    安卓日期选择对话框
    c语言语法分析器
    C语言文法
  • 原文地址:https://www.cnblogs.com/helloweworld/p/3093589.html
Copyright © 2011-2022 走看看