STL之序列容器deque
首先看看deque的模板声明:
template <class T, class Alloc = allocator<T>> // 原本还有个参数BufSize,现在新版本内置了,不允许用户指定了。
class deque {
//…
protected: // 数据成员
iterator start; // 表现第一个节点
iterator finish; // 表现最后一个节点
map_pointer map; // 指向map, map是块连续空间,其内的每个元素都是一个指//针,指向一块缓冲区(Buffer)
size_type map_size; // map内可容纳多少指针
……
};
vector是单向开口的连续性空间,deque则是一种双向开口的连续性空间(逻辑上)。所谓双向开口,意思是可以在头尾两端分别做元素的插入(常数阶)与删除(常数阶)。当然vector也可以,但其头部操作效率太差(线性阶),无法被接受。
为什么说它只是逻辑上为连续性空间呢?原因在于deque其实是将一段段的连续空间串联起来,而给人造成连续空间的假象,为了这一现象其迭代器真是费了不少功夫呢。
deque接受2个(之前版本为3个)模板参数,其中后者(之前版本为后2个)属于默认参数,一般的话只需写入元素类型即可,如:
deque<int> deq;
那么那个BufSize参数(之前版本,我们还是了解下)是用来做什么的呢?我们先来看看deque的构造方式。

如图所示,deque采用一块所谓的map作为主控。map是一小块连续空间,其中每个元素都是指针,指向另外一段较大的连续线性空间,称为缓冲区。缓冲区才是deque的存储空间主体。
deque <int, allocator<int>> deq;

(图片来自侯捷老师课程《STL与泛型编程》, 侵删)
deque内设2个迭代器,如上图所示分别为start和finish,每个迭代器拥有4个指针,分别为cur, first, last, node.像start的cur指向容器首元素,first指向该元素位于的缓冲区的头,last指向该元素位于的缓冲区的尾。通过指针node控制map的前进后退。当map使用率满载时,再找一个更大的空间来作为map,map又来控制缓冲区,如此而已。当然构造出连续空间的假象,迭代器的实现就比较麻烦了,这里就不介绍了,我们只做了解。
简单对deque的结构了解后,我们来写一段测试代码:
#include <deque>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
deque<,);
cout << "size = " << ideq.size() << endl; // size = 20(20个元素,都为9)
// 为每一个元素设置新值
; i < ideq.size(); i++) {
ideq[i] = i;
}
; i < ideq.size(); i++) { // 0 1 2 3 ...19
cout << ideq[i] << " ";
}
cout << endl;
; i < ; i++) {
ideq.push_back(i);
}
; i < ideq.size(); i++) { // 0 1 2 3 ...19 0 1 2
cout << ideq[i] << " ";
}
cout << "size = " << ideq.size() << endl; // size = 23
ideq.push_front();
; i < ideq.size(); i++) { // 99 0 1 2 3 ...19 0 1 2
cout << ideq[i] << " ";
}
cout << "size = " << ideq.size() << endl; // size = 24
deque<int, allocator<int>>::iterator iter;
iter = find(ideq.begin(), ideq.end(),);
;
}
当然随着编译器的版本的更新,内部细节会发生一些变化,比如新版本取消了让用户自定义buffersize,转为内部自行实现。但基本原理及其存储方式是不会变化的。况且deque容器之复杂,也不是可以用这么短的文字和代码说明的,这里只是介绍deque的基本存储结构和运用,如果有兴趣加深加深了解的话推荐《STL源码剖析》,同时也推荐直接打开系统头文件自行阅读。
STL之序列容器deque的更多相关文章
- STL之顺序容器 deque 动态数组
deque是一个动态数组,deque与vector非常类似,vector是一个单向开口的连续线性空间,deque则是双向开口的连续线性空间.两者唯一的区别是deque可以在数组的开头和末尾插入和删除数 ...
- STL常用序列容器
这里简要的记述一下STL常用容器的实现原理,要点等内容. vector vector是比较常用的stl容器,用法与数组是非类似,其内部实现是连续空间分配,与数组的不同之处在于可弹性增加空间,而arra ...
- STL之序列容器vector
首先来看看vector的模板声明: template <class T, class Alloc = allocator<T>> class vector { //… }; v ...
- STL标准库-容器-deque
技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性. deque双向开口可进可出的容器 我们知道连续内存的容器不能随意扩充,因为这样容易扩充别人那去 deque却可以,它创造了内存 ...
- STL标准库-容器-deque 双端队列
头文件: #include<deque> 常用操作: https://www.cnblogs.com/LearningTheLoad/p/7450948.html
- C++——STL之vector, list, deque容器对比与常用函数
STL 三种顺序容器的特性对比: vector 可变数组,内存空间是连续的,容量不会进行缩减.支持高效随机存取,即支持[]和at()操作.尾部插入删除效率高,其他位置插删效率较低: list 双向链表 ...
- 《STL源码剖析》——第四章、序列容器
1.容器的概观与分类 所谓序列式容器,其中的元素都可序(ordered)[比如可以使用sort进行排序],但未必有序(sorted).C++语言本身提供了一个序列式容器array,STL另外再提供v ...
- C++ STL之list容器的基本操作
由于list和vector同属于序列式容器,有很多相同的地方,而上一篇中已经写了vector,所以这一篇着重写list和vector的不同之处和特有之处. 特别注意的地方: (1)STL中迭代器容器中 ...
- ###STL学习--关联容器
点击查看Evernote原文. #@author: gr #@date: 2014-08-23 #@email: forgerui@gmail.com STL中的关联容器. ###stl学习 |--迭 ...
随机推荐
- https/相对路径,绝对路径
1. htttps HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全 ...
- Git 基础
取得项目的 Git 仓库 有两种取得 Git 项目仓库的方法.第一种是在现存的目录下,通过导入所有文件来创建新的 Git 仓库.第二种是从已有的 Git 仓库克隆出一个新的镜像仓库来. 在工作目录中初 ...
- [java]wordcount程序
词数统计系统. 作业解析:这次作业的内容是从本地读取一个程序代码,计算出这个程序中的行数,单词数,也可进行拓展. 实现语言:java 编程思路: 程序是由各种单词和符号组成的,单词包括关键字,标识符这 ...
- 依赖注入 – ASP.NET MVC 4 系列
从 ASP.NET MVC 3.0 开始就引入了一个新概念:依赖解析器(dependence resolver).极大的增强了应用程序参与依赖注入的能力,更好的在 MVC 使用的服务和创 ...
- 远程监控显示brother数控机床数据
最近几个月公司太忙了,到现在已经连续出差两个多月了. 这个项目这要做mes系统,涉及到产品在机床的加工过程监控,然后led看板显示产品进度. 这里的主角是日本的brother数控机床,服务器按照一定频 ...
- Git 常见问题: unable to negotiate with *.*.*.*: no matching key exchange methodfound...
在Windows上更新了git 版本后,clone/pull时出现错误, unable to negotiate with *.*.*.*: no matching key exchange meth ...
- Shell编程之--“grep-awk-sed” 基础用法汇总-菜鸟入门级
- -Three.js开发指南---用three.js创建你的第一个三维场景(第一章)
本章主要做了下面的工作 1 生成一个简单的场景,该场景的物体只有平面和坐标轴 2 在第一个demo的基础上添加光源和方块物体,并生成阴影 3 在第二个demo的基础上,增加动画,使得方块进行旋转 4 ...
- 承接Unreal4外包虚幻外包,北京正规公司
VR产业链的现状 去年Facebook 20亿美元收购虚拟现实技术Oculus VR,提高了大家对VR设备.而国内,红杉资本投资蚁视,更是引爆了资本市场对VR/AR 的关注.其中有四块是我们较为常见且 ...
- Linux运行与控制后台进程的方法:nohup, setsid, &, disown, screen
我们经常会碰到这样的问题,用ssh登录了远程的Linux服务器,运行了一些耗时较长的任务,结果却由于网络等的不稳定导致任务中途失败.这是由于在用户注销(logout)或者网络断开时,终端会收到 HUP ...