STL

本文深入探讨了C++ STL中各种容器的底层实现方式,包括vector、list、deque、stack、queue、priority_queue、set、multiset、map、multimap、hash_set等的数据结构特点及其应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STL底层数据结构实现

C++ STL 的实现:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 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()是相等的;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值