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这么做肯定是考虑到了这个需求.
 
 
 
 
 

STL总结之deque的更多相关文章

  1. STL容器分析--deque

    deque,故名思义,双向队列.可以在头尾进行插入删除. 而STL中采用了链表+线性表的数据结构来实现deque,因而除了满足双向队列的特点以外,还支持随机访问. 下面,贴一段代码. 总览:双向队列是 ...

  2. STL源代码分析--deque

    一.deque的中控器       deque是连续空间(至少逻辑上看来如此),连续线性空间总令我们联想到array或vector.array无法成长,vector虽可成长,却仅仅能向尾端成长.并且其 ...

  3. [STL] Implement "vector", ”deque“ and "list"

    vector “可增的”数组 vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似. 不同的地方就是: (1) 数组是静态分配空间,一旦分配了空间的大小,就不可再改变了: (2) v ...

  4. 【转】[STL]vector和deque的内存释放(clear)

    vector的clear成员函数可以清除vector中的元素,使其大小减至0.但它却不能减小vector占用的内存. [cpp] view plain copy int main() { vector ...

  5. STL——容器(deque) 构造 & 头尾添加删除元素

    1.deque容器概念 deque是"double-ended queue"的缩写,和vector一样都是STL的容器,唯一不同的是:deque是双端数组,而vector是单端的. ...

  6. STL之vector,deque学习实例

    ``` #include<iostream> #include<algorithm> #include<ctime> #include<vector> ...

  7. STL容器之deque

    [1]deque容器 deque 是对 vector 和 list 优缺点的结合,它是处于两者之间的一种容器. [2]deque方法集 应用示例代码: #include <deque> # ...

  8. STL容器:deque双端队列学习

    所谓deque,是"double-ended queue"的缩写; 它是一种动态数组形式,可以向两端发展,在尾部和头部插入元素非常迅速; 在中间插入元素比较费时,因为需要移动其它元 ...

  9. STL之三:deque用法详解

    转载于:http://blog.csdn.net/longshengguoji/article/details/8519812 deque函数: deque容器为一个给定类型的元素进行线性处理,像向量 ...

随机推荐

  1. Nosql_笔记

    Nosql: http://www.infoq.com/cn/news/2011/01/nosql-why/ Redis: http://www.jb51.net/article/59294.htm ...

  2. debian 学习记录-3 -关于linux -1

    来源:<Debian标准教程>王旭 著 芬兰人Linus Trovalds 1991年1月2日····   2006年初发布内核2.6.15 使用Andrew Tanenbaum < ...

  3. 电脑升级完Xcode8后 注释快捷键无效的问题

    1.部分电脑升级完Xcode8 后直接重启电脑就可以使用Command +/ 快捷键注释代码, 2.如果上述方法没有效果,可以在终端输入sudo /usr/libexec/xpccachectl  然 ...

  4. org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode

    [spring]:org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowe ...

  5. Open CASCADE 基础类(Foundation Classes)

    1 介绍(Introduction) 1 如何使用Open CASCADE技术(OCCT)基础类. This manual explains how to use Open CASCADE Techn ...

  6. cocos2d-js Mac下的JSB绑定步骤

    cocos2d-js由于采用js语言,使得做一些native的功能比较受限,例如文件和目录操作.socket操作等.逼不得已,这时我们就不得不做jsbinding了.. 官方提供的jsbinding方 ...

  7. MVC去掉传参时的验证:从客户端中检测到有潜在危险的Request.QueryString值

    解决方法:给Action添加属性[ValidateInput(false)]. 例: [ValidateInput(false)] public ActionResult Index(string o ...

  8. Winodws live writer

    发布一篇试试.

  9. Amazon Alexa 语音识别2 : 设置

    开发者建立的Skill的主要设置项目都在Skill的console内.需要填写的东西大致有以下几个: 1.Skill 名字.这个名字是用户用来唤醒你这个Skill的. 2.Intent Schema: ...

  10. js中构造字符串若放入Grails中gsp的<g:link>标签出错

    Grails的ajax使用json格式返回,在js中构造字符串时若放入<g:link>标签,字符串构造就会错误 如下就会发生错误,导致回调函数无法执行 function show(obj) ...