文章目录

  • deque的简介(双开口的“连续”空间的数据结构。)
  • deque的存储结构:
    • 默认构造
    • 从队头取数据
    • 插入数据
    • 如果此时再插入一个元素,会引发新的缓冲区配置。
    • 头插元素和尾插元素:
    • 再次头插:
    • 注意:(串接空间)

deque的简介(双开口的“连续”空间的数据结构。)

  1. deque是由一块一块的固定大小的连续空间构成(块与块之间是不连续的)。一旦有必要,在deque的前端或者尾端增加新的空间,便配置一块固定大小的连续空间串接在整个deque的头端或者尾端。

  2. deque 的最大任务,便是在这些分块的固定大小连续空间上,维护其整体连续的假象,并提供随机存取的接口(随机迭代器),代价则是迭代器架构较为复杂。

  3. deque 采用一块所谓的_M_map(不是STL的map容器)作为主控。这里所谓 _M_map是一小块连续空间,其中每个元素(此处称为一个节点,node)都是指针,指向另一段(较大的)连续线性空间,称为缓冲区。缓冲区才是deque 的储存空间主体。

deque的存储结构:

//迭代器template<class _Tp>
struct _Deque_iterator
{typedef _Tp** _Map_pointer;_Tp* _M_cur;_Tp* _M_first;_Tp* _M_last;_Map_pointer _M_node;
};// deque
template<typename _Tp>
class _Deque_base
{typedef _Deque_iterator<_Tp> iterator;
protected:_Tp** _M_map;size_t _M_map_size;iterator _M_start;iterator _M_finish;
};

默认构造

#include<deque>
int main(void)
{std::deque<int> deq1;return 0;
}

如下图:
可以看到此时的_M_map为空,大小为0;
开始迭代器和结束迭代器中的各指针也为空,

std::deque<int> iqu;
for(int i =1,i<5;i++ )
{iqu.push_back(i);
}

插入元素:

从队头取数据

iqu.pop_front()iqu.pop_front()

插入数据

for(int i = 6;i<15;i++)
{iqu.push_back(i);
}

如果此时再插入一个元素,会引发新的缓冲区配置。

iqu.push_back(16)

头插元素和尾插元素:

iqu.push_back(20);
iqu.push_back(30);
iqu.push_back(40);
iqu.push_back(50);
iqu.push_front(23);
iqu.push_front(34);

再次头插:

iqu.push_front(45);
iqu.push_front(56);

注意:(串接空间)

  1. 如果插入的时候,_Map_size的下半部分已经满了,而上半部空闲,就会把在申请新的缓冲区,就会将m_node向上移动。
  2. 如果deque中的_Map_size已经满了,在_M map的前端或者尾端增加新的空间,便配置一块固定大小的连续空间,**串接在整个deque的头端或者尾端。**不需要拷贝数据。

【C++STL】deque的结构和使用相关推荐

  1. C++ STL deque 容器底层实现原理(深度剖析)

    事实上,STL 中每个容器的特性,和它底层的实现机制密切相关,deque 自然也不例外.<C++ STL deque容器>一节中提到,deque 容器擅长在序列的头部和尾部添加或删除元素. ...

  2. STL Deque 容器

    STL Deque 容器 Deque简介 deque是"double-ended queue"的缩写,和vector一样都是STL的容器,deque是双 端的,而vector是单端 ...

  3. STL~Deque简介

    STL~Deque简介 转自百度经验 deque简介 deque是双向开口的连续性存储空间.虽说是连续性存储空间,但这种连续性只是表面上的,实际上它的内存是动态分配的,它在堆上分配了一块一块的动态储存 ...

  4. 深入研究 C++中的 STL Deque 容器

    本文档深入分析了std::deque,并提供了一个指导思想:当考虑到内存分配和执行性能的时候,使用std::deque要比std::vector好. 介绍 本文深入地研究了std::deque 容器. ...

  5. STL( deque容器 )

    3.3 deque容器 3.3.1 deque容器基本概念 Vector容器是单向开口的连续内存空间,deque则是一种双向开口的连续线性空间.所谓的双向开口,意思是可以在头尾两端分别做元素的插入和删 ...

  6. java合并果子_C++(STL)树-堆结构练习——合并果子之哈夫曼树

    priority_queue 对于基本类型的使用方法相对简单. 他的模板声明带有三个参数,priority_queue Type 为数据类型, Container 为保存数据的容器,Functiona ...

  7. C++ STL deque容器添加和删除元素方法完全攻略

    deque 容器中,无论是添加元素还是删除元素,都只能借助 deque 模板类提供的成员函数.表 1 中罗列的是所有和添加或删除容器内元素相关的 deque 模板类中的成员函数. 表 1 和添加或删除 ...

  8. 计蒜客 A2232.程序设计:蒜厂年会-单调队列(双端队列(STL deque)实现)滑窗维护最小前缀和...

    程序设计:蒜厂年会 问答问题反馈 只看题面 16.79% 1000ms 262144K 在蒜厂年会上有一个抽奖,在一个环形的桌子上,有 nn 个纸团,每个纸团上写一个数字,表示你可以获得多少蒜币.但是 ...

  9. c++ STL deque容器成员函数

    deque是双向队列,即可以在头部插入删除,也可以在尾部插入删除.内部并不连续,这一点和vector并不一样.可能第1个元素和第2个元素的地址是不连在一起的.在使用时用it迭代器会安全一点. 这是c+ ...

最新文章

  1. Android 四大组件之——Acitivity(二) 启动模式
  2. 项目安排[动态规划]
  3. Oracle 数据库启动 startup和startup force的区别
  4. 关闭 Windows Server 2008 用户权限控制(UAC)
  5. python 支持向量机预测结果相同_Python机器学习算法 — 支持向量机(SVM)
  6. oracle 添加字段
  7. oracle oci.dll的作用,ASP.NET bin目录中的Oracle oci.dll无法删除/不起作用
  8. 如何网络监测其他计算机关闭445端口,关闭445端口的方法,小编告诉你电脑如何关闭445端口-站长资讯中心...
  9. 无法对齐已对齐的分区linux,使用parted命令对齐分区,以获得最佳性能
  10. Linux进程管理:进程调度之完全公平调度算法
  11. 开发人员最佳配色主题
  12. AcWing 1270. 数列区间最大值(RMQ问题)
  13. 如何在M1的Mac上检查App是原生执行,还是Rosetta转译后执行?
  14. 一文让你彻底弄清failfast、failsafe、failover、failback、failsilent
  15. 案例教程—200行python实现杀手级连连看外挂程序
  16. CGAL::2D Arrangements
  17. 戴尔服务器无限重启6,戴尔笔记本无限重启具体解决办法
  18. Matplotlib 实战总结,超全!超长!
  19. 逃跑吧少年维护服务器,逃跑吧少年11月19日PC端更新公告
  20. Windows Server 2012R2 启用网络发现失败

热门文章

  1. 【从零开始JavaEE课设】《影院系统》成品展示——后台管理系统
  2. 基于GRU和am-softmax的句子相似度模型需要的数据集
  3. linux查看监听请款,请款(MIRO)RFC
  4. 重根的二阶迭代法matlab,计算方程重根的一个高阶迭代程序
  5. 百度快照被劫持 标题描述被篡改的处理过程
  6. You are infinite. And on those keys, the music that you can make is infinite.
  7. 【科研绘图封面教程】C4D+PS教学绘制优秀期刊封面第一期
  8. html翻译系统,如何实现网页自动翻译成终端系统的文字?
  9. 身为iOS开发,你是愿意在大公司做凤尾,还是在小公司做鸡头?
  10. firefox如何屏蔽网站广告