文章目录

  • 一、关于deque
  • 二、底层结构
    • (1)deque迭代器
    • (2)deque结构
    • (3)内存结构图

一、关于deque

std::deque ( double-ended queue ,双端队列)是有下标顺序容器,它允许在其首尾两端快速插入及删除。另外,在 deque 任一端插入或删除不会非法化指向其余元素的指针或引用。

与 std::vector 相反, deque 的元素不是相接存储的:典型实现用单独分配的固定大小数组的序列,外加额外的登记,这表示下标访问必须进行二次指针解引用,与之相比 vector 的下标访问只进行一次。

deque 的存储按需自动扩展及收缩。扩张 deque 比扩张 std::vector 更优,因为它不涉及到复制既存元素到新内存位置。另一方面, deque 典型地拥有较大的最小内存开销;只保有一个元素的 deque 必须分配其整个内部数组(例如 64 位 libstdc++ 上为对象大小 8 倍; 64 位 libc++ 上为对象大小 16 倍或 4096 字节的较大者)。

deque 上常见操作的复杂度(效率)如下:

  • 随机访问——常数 O(1)
  • 在结尾或起始插入或移除元素——常数 O(1)
  • 插入或移除元素——线性 O(n)

二、底层结构

(1)deque迭代器

template<class _Tp>
struct _Deque_iterator
{typedef _Tp** _Map_pointer;_Tp* _M_cur;    //当前区块元素地址_Tp* _M_first;    //当前区块首元素地址_Tp* _M_last;    //当前区块尾元素地址_Map_pointer _M_node; //当前区块首地址(二级指针)
};

(2)deque结构

template<class _Tp>
class _Deque_base
{typedef _Deque_iterator<_Tp> iterator;
protected:_Tp** _M_map;         //_Tp* _M_map[];首地址size_t _M_map_size;      //_M_map的缓冲区大小iterator _M_start;        //标识_M_map的首个内存区块的迭代器iterator _M_finish;        //标识_M_map的最后一个内存区块的迭代器
};

(3)内存结构图

deque内存的增长方式:

  • push_front(),头插元素,若当前区块满,则向上开辟新的区块,改变_M_start迭代器的内容重新标识即可。
  • push_back(),尾插元素,若当前区块满,则向下开辟新的区块,改变_M_finish迭代器的内容重新标识即可。

【C++】STL中deque底层剖析相关推荐

  1. C++ STL中set底层实现方式

    Q:STL中set底层实现方式? 为什么不用hash? A: 第一个问题:set底层实现方式为RB树(即红黑树). 第二个问题: 首先set,不像map那样是key-value对,它的key与valu ...

  2. 一文搞懂 STL 中 deque 与 hashtab 的底层实现

    文章目录 一.模板特化 二.设计容器必须定义的型别 三.deque 四.心心念念的优先队列 五.hashtable的构造 一.模板特化 针对任何模板参数更进一步的条件限制所设计出来的一个特化版本,如: ...

  3. C++ STL : 模拟实现STL中的容器适配器stack和queue

    目录 什么是容器适配器 stack stack的文档介绍-(来自cplusplus) stack的实现 queue queue的文档介绍-(来自cplusplus) queue的实现 什么是容器适配器 ...

  4. STL中的双向队列deque

    1.STL中的双向队列deque deque也是顺序容器的一种,同时也是一个可变长数组.要使用deque,需要包含头文件deque.所有适用于vector的操作都适用于deque. deque和vec ...

  5. STL中基本容器有: string、vector、list、deque、set、map

    为什么80%的码农都做不了架构师?>>>    在STL中基本容器有: string.vector.list.deque.set.map set 和map都是无序的保存元素,只能通过 ...

  6. STL中vector、list、deque和map的区别

    vector 向量 相当于一个数组     在内存中分配一块连续的内存空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacituy( ...

  7. C++ STL中vector用法简要总结

    1.基本使用举例 下面的代码给出了vector的基本使用举例. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ...

  8. C++ STL : 模拟实现STL中的list类

    文章目录 list list的介绍 list的优缺点 list的迭代器失效问题 实现的接口 节点部分 迭代器部分 list部分 代码实现 list list的介绍 list的文档介绍 list是可以在 ...

  9. 深入解析C++ STL中的常用容器

    转载:http://blog.csdn.net/u013443618/article/details/49964299 这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点.STL中的 ...

最新文章

  1. N - Find a way HDU - 2612
  2. 学界 |《nature》杂志:我们有义务搞懂我们所创造出来的技术
  3. Collections练习之按照字符串长度进行排序
  4. 连续两天,8 大技术论坛,微软超 60 个烧脑议题等你来战
  5. 程序员薪资怎么论高级还是初级_和程序员一样高薪,却过着清闲生活,测试员什么人都可做吗?...
  6. Java:JSON解析工具-org.json
  7. mysql多个left join
  8. 基于成熟网管平台的网管软件开发模式
  9. (5)Typora——MarkDown格式文本编辑器
  10. 论文查重系统哪个好?
  11. Element Plus的分页组件el-pagination显示英文
  12. 苹果计算机关机时间不准,mac长时间不关机时间不准确问题
  13. python与sql的区别_2020年入门数据分析选择Python还是SQL?七个常用操作对比!
  14. H. Zebras and Ocelots -ICPC North Central NA Contest 2017
  15. 佩伯尔幻像_幻像类型提高了编译时的安全性
  16. java课程 数独 文库_JAVA课程设计九宫格数独.pdf
  17. java ssl 报错 Received fatal alert: illegal_parameter
  18. DHU 第一题 重排链表
  19. 在操场跑步,逆时针比顺时针更快的原因
  20. 再下一城!CPC即将登录全球知名交易所BiKi!

热门文章

  1. 怎样修改服务器设定的概率,人渣怎么设置资源倍数 服务器设置方法
  2. 基于JavaSSM+MySQL的学生综合素质测评系统设计与实现
  3. Linux做代理上网服务器
  4. 一张图带你了解数据分析的完整流程,建议收藏
  5. 信息学奥赛一本通——1011:甲流疫情死亡率
  6. 驱动K92G08U0B
  7. java实现十进制小数转换二进制
  8. NR HARQ资源位置以及码本的确定
  9. golang单例模式
  10. 兄弟 brother,数控系统数据采集,NC程序下发实战