STL中deque是我们常说的双端队列,既可以从头添加元素,也可以从尾部添加元素,deque的成员函数和vector的成员函数十分相似,但是它们的内部实现却又很多不同.
 
deque的模板声明:
template < class T, class Allocator = allocator< T> > class deque;
 
1)deque的内存分配方式,deque的内存管理方式比vector复杂.
 
上面程序在执行完最后的push_back后内存分布如下图:

 
追踪push_back函数我们看到:
我们先看几个变量的含义, _Myoff成员变量始终表示队头距离存储空间开始位置的元素个数, _DEQUESIZ宏定义如下,可以看到为了避免太小内存块,_DEQUESIZ会根据我们定义类型大小来确定一个block大小.
_Mysize表示队列中实际元素个数,_Map是一个_Ty**类型二级指针,正是挂接block的chunk, 宏_DEQUEMAPSIZ正是_Map的最小分配粒度.

如果存储空间不足时_DEQUESIZ我们要进行内存分配, 可以看到程序根据_Myoff和_Mysize来计算block编号,因此我们可以把_Map看成是一个环,而所有的block也可以看成一个环.在前面计算好block后,
判断该block是否已经分配内存,如果没有则分配内存,如果有则直接对新添加的对象在分配的内存中进行构造.
 
下面我们看下_Growmap函数,这里我做了简化,把copy数据的过程去掉了,我们可以看到在我们重新分配内存大小是以原来chunk大小的一半进行增加,如果增加大小小于最小粒度_DEQUEMAPSIZ,则取最小粒度,
如果用户需求大于我们计算的值,则以用户需求值进行增加,然后释放原来_Map的空间.
 
其他push_front操作和push_back操作类似,只是在计算block位置是不一样, 如下:
 
 
2)deque其他操作,pop_front和pop_back时只是将队头和队尾元素移除,进行insert操作时有点复杂,我们看看插入在一个位置插入多个元素的情况.
上面列出了靠近队头位置时的处理情况,靠近队尾时情况差不多,这里不再贴出,insert的其他重载函数操作类似.
 
deque在进行erase进行移除元素时,要比insert操作简单多了,如下:
 
deque的clear操作和vector不一样,这里clear的话是直接将内存释放掉了.
 
总结:deque在进行内存管理上更复杂,但与vector比较内存管理更加有效,特别是对大量数据序列,不过我们可以看到内存在根据我们的需求不断申请,但是没有释放,如果在数据量波动比较大的地方,可能比较消耗内存,
不过我们可以使用clear函数将内存释放掉,我想clear这么做肯定是考虑到了这个需求.
 
 
 
 
 

转载于:https://www.cnblogs.com/ourroad/p/3356053.html

STL总结之deque相关推荐

  1. c++STL容器的Deque

    STL容器的Deque Deque简介 deque对象的默认构造 deque末尾的添加移除操作 deque的数据存取 deque与迭代器 deque对象的带参数构造 deque的赋值 deque的大小 ...

  2. STL常用容器——deque容器的使用

    文章目录 STL常用容器--deque容器的使用 1.deque 容器简介 2.deque容器的构造函数 3.deque的赋值操作 4.deque大小操作 5.deque容器添加和删除元素 6.deq ...

  3. STL vector list deque区别与实现

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

  4. STL系列之一 deque双向队列

    原文地址:http://blog.csdn.net/morewindows/article/details/6946811 deque双向队列是一种双向开口的连续线性空间,可以高效的在头尾两端插入和删 ...

  5. C++:STL之vector,deque对比

    为什么80%的码农都做不了架构师?>>>    之所以专门把STL中的这两个拿出来说一说,是因为vector和deque都是支持随机访问的,其支持的迭代器类型都为随机访问,而不像ma ...

  6. 【STL容器讲解—deque】

    STL中deque容器讲解 deque容器的实现 相对于vector容器的区别 原因: deque内部工作原理 构造函数 容器操作 插入操作 deque容器的遍历操作 大小操作 插入和删除 数据存取 ...

  7. C++ STL 容器之 deque简单使用

    #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; #include <deque> ...

  8. STL容器之deque

    双端队列:序列式容器(deque/vector):底层分段连续 支持从双端进行插入和删除: 综合了vector和list的优点: 插入.删除.查找的平均时间复杂度都是O(1) 部分deque的操作如下 ...

  9. C++ STL: 超详细 容器 deque 以及 适配器queue 和 stack 源码分析

    文章目录 前言 deque 实现 deque类 _Deque_iterator 类 deque 的元素插入 insert函数 deque如何模拟空间连续 queue 实现 stack 的实现 前言 C ...

最新文章

  1. glide_在Android中将数据绑定与Glide结合使用
  2. VC对话框最小化到托盘
  3. 文件或目录权限chmod,更改所有者和所属组chown ,umask的使用 ,隐藏权限的使用 lsattr,chattr...
  4. small2java_java类
  5. 推荐neter常用优秀开源项目系列之一
  6. TCP协议为什么会采用三次握手,若采用二次握手可以吗?
  7. 计算机系统的组成一般不包括,建筑设备监控子系统组成一般不包括( )A.中央计算机系统B.布线系统C.DDCD.各类传感器及执 - 作业在线问答...
  8. 关机王自动定时关机软件 3.579 正式版
  9. 微信公众号自动回复如何添加超链接
  10. Win10下安装python和pycharm
  11. mssql数据库和Oracle数据库注入
  12. 形状超链接html,ppt中标注形状超链接怎么做
  13. 多个服务器数据互通_8月6日部分服务器数据互通公告!
  14. 基于C语言的Q格式使用详解
  15. STM32F103C8T6控制LED灯轮流闪烁
  16. xxxxxxxxxxxx
  17. 通过 汇编了解C语言 指针 悬垂指针概念
  18. c语言计算圆球体积r为整数,c语言 设圆球的半径为r,计算并输出圆球的体积v.输出结果...
  19. 超级详细!!!SpringBoot2核心技术与响应式编程尚硅谷完整知识点笔记 下篇 自动配置、容器、Web、数据响应、拦截器、SQL、NOSQL、原理、Junit5、Actuator、外部化配置等
  20. html 浮动提示文本框,html浮动提示框功能如何实现 html浮动提示框功能实现代码...

热门文章

  1. 小程序引入的echarts过大如何解决_小程序如何解决社区团购的痛点
  2. 单片机 c语言 宏程序,宏程序学习的几点心得.doc
  3. php容器原理,容器与依赖注入的原理
  4. 1333和1600能双通道吗_波音797何时到来?会成为A321XLR的竞争对手吗?
  5. php clearinterval,JavaScript定时函数(2)setInterval与clearInterval
  6. 大一考二级c语言,大专学生计算机二级是大一考还是大二考
  7. 2018专转本计算机百度云资源,2018年江苏专转本计算机真题版
  8. mac java tomcat_mac平台tomcat部署web项目
  9. java中int边界值_数组中重复的数字2019.12.06
  10. java 网络请求 生成本地图片