deque,故名思义,双向队列。可以在头尾进行插入删除。

而STL中采用了链表+线性表的数据结构来实现deque,因而除了满足双向队列的特点以外,还支持随机访问。

下面,贴一段代码。

总览:双向队列是由链式线性表+顺序线性表组成。支持随机访问

首先看下定义:  

template >      

class deque : protected _Deque_base

可知,需先分析_Deque_base  

template        

class _Deque_base {            

...            

_Deque_impl _M_impl;        

};

其中,_Deque_impl类型的_M_impl是维持deque有序的关键数据结构,      

struct _Deque_impl       : public _Tp_alloc_type      

{     _Tp** _M_map;    

  size_t _M_map_size;    

  iterator _M_start;    

  iterator _M_finish;

    _Deque_impl()     : _Tp_alloc_type(), _M_map(0), _M_map_size(0),       _M_start(), _M_finish()     { }

    _Deque_impl(const _Tp_alloc_type& __a)     : _Tp_alloc_type(__a), _M_map(0), _M_map_size(0),       _M_start(), _M_finish()     { }       };

可知,在_M_impl中,保存了一个_Tp*的数组_M_map,每个数组的大小为_M_map_size. 并保存了实际数据起始和终止的迭代器。

假如说_M_map_size = 0x10

0x70002000:                         0x70002010             

       __________________

_M_map      |__________________|

0x70003000:                     0x70003010              __________________             |__________________|  _M_start可以指向任何位置              __________________             |__________________|              __________________             |__________________|              __________________             |__________________| _M_end也可以指向任何位置,只是需要在_M_map中存放于_M_start之后              __________________             |__________________|

至此,可以通过链表找到顺序线性表,接下来就是定位顺序线性表中元素的位置

STL容器分析--deque的更多相关文章

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

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

  2. STL源代码分析--deque

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

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

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

  4. STL容器分析--set

    STL 对这个序列可以进行查找,插入删除序列中的任意一个元素,而完成这些操作的时间同这个序列中元素个数的对数成比例关系,并且当游标指向一个已删除的元素时,删除操作无效.而一个经过更正的和更加实际的定义 ...

  5. STL——容器(deque)deque 的删除 clear() erase()

    deque.clear(); //移除容器的所有数据 1 #include <iostream> 2 #include <deque> 3 4 using namespace ...

  6. STL——容器(deque) deque 的大小

    1. deque 的大小 deque.size();              //返回容器中元素的个数 1 #include <iostream> 2 #include <dequ ...

  7. STL——容器(deque) 元素的存取&迭代器

    1. deque 的数据存取 这个部分和 vector 几乎一样 第一  使用下标操作 dequeName[0] = 100; //小心越界 第二  使用at 方法 如: dequeName.at(2 ...

  8. STL——容器(deque)deque 的插入 insert()

    deque.insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置. 1 #include <iostream> 2 #include <d ...

  9. STL——容器(deque) deque 的赋值 assign() operator=() swap()

    deque 的赋值分下边4种方法: deque.assign(beg,end); //将[beg, end)区间中的数据拷贝赋值给本身.注意该区间是左闭右开的区间. 1 #include <io ...

随机推荐

  1. Spring中与Spring相关的注解

    # 一.Spring的常用组件类注解 ## @Component     被该注解所修饰的类是一个普通的spring bean类,该注解可以替代@Controller.@Service.@Reposi ...

  2. POJ 2139 Six Degrees of Cowvin Bacon (弗洛伊德最短路)

    题意:奶牛拍电影,如果2个奶牛在同一场电影里演出,她们的合作度是1,如果ab合作,bc合作,ac的合作度为2,问哪一头牛到其他牛的合作度平均值最小再乘100 思路:floyd模板题 #include& ...

  3. Java高级架构师(一)第38节:Nginx的负载均衡模块

    负载均衡: 1.热备:如果你有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务.服务器处理请求的顺序:AAAAAA突然A挂啦,BBBBBBBBBBBBBB..... upstream ...

  4. ubuntu中使用apt-get install 安装的软件的一些目录所在地

    apt-get 所下载的用于安装的软件包,在 /var/cache/apt/archives中.如果执行过 apt-get clean ,那么原始下载的包就找不到了. 1.下载的软件存放位置/var/ ...

  5. Web安全开发指南--数据验证

    1.数据验证 4.1.输入数据验证安全规则 1 数据验证必须放在服务器端进行. 2 至少对输入数据的数据类型.数据范围和数据长度进行验证. 3 所有来自不可信数据源(比如网络.用户命令.数据库和文件系 ...

  6. [Linux] Linux命令之pstree - 以树状图显示进程间的关系

    转载自: http://codingstandards.iteye.com/blog/842156 pstree命令以树状图显示进程间的关系(display a tree of processes). ...

  7. eclipse安装pydev

    eclipse是常用的用来写java代码的IDE,但是其实也可以用来写python代码,只需要配置好pydev即可. 第一步 打开eclipse,点击Help,install new sofeware ...

  8. Python datetime 格式化字符串:strftime()

    Python datetime 格式化字符串:strftime()   Python 的datetime模块 其实就是date和time 模块的结合, 常见的属性方法都比较常用 比如: datetim ...

  9. AndroidStudio刚開始学习的人

    看到谷歌宣布Android Studio将代替Eclipse. 自从7月25日開始我就開始学习使用AS,由于看到谷歌公司公布的说为了简化Android的开发力度,Google决定将重点建设Androi ...

  10. mysql索引处理

    1.索引作用在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍.例如,有3个 ...