记录下对STL deque实现的理解

本文介绍了deque双端队列的数据结构特点,支持快速访问和灵活插入/删除。重点讲解了其底层实现原理,包括非STL map和vector缓存段,以及内存管理策略,如reallocate_map函数。了解deque在性能上的优势和限制,对于高效编程有帮助。

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

deque 双端队列 是由一段一段的定量连续空间构成

特点:支持快速随机访问,支持索引取值。 在头尾插入和删除速度很快。

底层内部由一个map(非STL的map) 和多个vector缓存段组成,迭代器使用时会在不同的区间跳转。

存取元素的时候,deque内部结构多出一个间接过程,相比vector操作会慢一些,

相比vector,vector在头部操作效率太低。deque 允许于常数时间内对头端进行元素的插入或移除操作。deque没有所谓的容量 capacity 观念,因为它是动态的以分段连续空间组合而成,随时可以增加一段新的空间并连接起来。

底层map(非STL map) 此map 仅代表连续的一段缓存,内存空间大小 默认8,最大 所需节点数 + 2 。

存储数据的数据区不是连续的,从上一个缓存区到下一个缓存区需要调用set_node方法才可以跳转的,所以运算符 ++ -- +n 操作时要慎重。

map中的前2个 和后2个都是预留缓存区,前面的是为了deque 调push_front的时候用。

 

扩容 reallocate_map() 。当map 前面或者后面存满了(不管是前端还是尾部,只要有一端出现备用空间不足)就会调用rellocate_map 来重新分配内存。

push_front() --- push_front_aux() --- reserve_map_at_front() --- 判断前端节点备用空间不足 ---  reallocate_map()

push_back() --- push_back_aux() --- reserve_map_at_back() --- 判断尾部节点备用空间不足 --- reallocate_map()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值