STL

    xiaoxiao2021-03-25  134

    STL底层数据结构实现

    C++ STL 的实现:

    vector 底层数据结构为数组 ,支持快速随机访问

    list 底层数据结构为双向链表,支持快速增删

    deque 底层数据结构为一个中央控制器和多个缓冲区,详细见STL源码剖析P146,支持首尾(中间不能)快速增删,也支持随机访问 deque是一个双端队列(double-ended queue),也是在堆中保存内容的.它的保存形式如下: [堆1] –> [堆2] –>[堆3] –> … 每个堆保存好几个元素,然后堆和堆之间有指针指向,看起来像是list和vector的结合品.

    stack 底层一般用list或deque实现,封闭头部即可,不用vector的原因应该是容量大小有限制,扩容耗时

    queue 底层一般用list或deque实现,封闭头部即可,不用vector的原因应该是容量大小有限制,扩容耗时

    (stack和queue其实是适配器,而不叫容器,因为是对容器的再封装)

    priority_queue 的底层数据结构一般为vector为底层容器,堆heap为处理规则来管理底层容器实现

    set 底层数据结构为红黑树,有序,不重复

    multiset 底层数据结构为红黑树,有序,可重复

    map 底层数据结构为红黑树,有序,不重复

    multimap 底层数据结构为红黑树,有序,可重复

    hash_set 底层数据结构为hash表,无序,不重复

    hash_multiset 底层数据结构为hash表,无序,可重复

    hash_map 底层数据结构为hash表,无序,不重复

    hash_multimap 底层数据结构为hash表,无序,可重复

    考点

    Q:STL中set底层实现方式? 为什么不用hash?

    A: 第一个问题:set底层实现方式为RB树(即红黑树)。

    第二个问题:

    首先set,不像map那样是key-value对,它的key与value是相同的。关于set有两种说法,第一个是STL中的set,用的是红黑树;第二个是hash_set,底层用得是hash table。红黑树与hash table最大的不同是,红黑树是有序结构,而hash table不是。但不是说set就不能用hash,如果只是判断set中的元素是否存在,那么hash显然更合适,因为set 的访问操作时间复杂度是log(N)的,而使用hash底层实现的hash_set是近似O(1)的。然而,set应该更加被强调理解为“集合”,而集合所涉及的操作并、交、差等,即STL提供的如交集set_intersection()、并set_union()、差集set_difference()和对称差集set_symmetric_difference(),都需要进行大量比较工作,那么使用底层是有序结构的红黑树就十分恰当了,这也是其相对hash结构的优势所在。

    在编程的时候发现的问题

    当vector为空的时候,vector.begin()和vector.end() 当vector为空的时候,可以发现begin()和end()是相等的;
    转载请注明原文地址: https://ju.6miu.com/read-10237.html

    最新回复(0)