[翻译] C++ STL容器参考手册(第二章 <deque>)
本章节原文:http://www.cplusplus.com/reference/deque/deque/
1. std::deque
template < class T, class Alloc = allocator<T> > class deque;
双端队列
deque(发音类似"deck")是对double-ended-queue比较特殊的缩写方式。deque是动态长度的序列容器,可以向任意一端扩展或者从任意一端缩短。
不同的库对deque有不同的实现,总的来说都是以某种动态数组的形式。在任何情况下,任一元素都可以通过随机迭代访问器来访问,同时容器的存储空间会根据需要被自动扩展或收缩。
因此,deque提供了类似于vector的功能,只不过不仅在容器末端,在deque的前端添加与删除元素也都有很高的效率。此外,与vector不同的是,deque并不保证其所有的元素都被存储在连续的空间:将指向一个元素的指针加上偏移地址来访问其他元素的方法会导致不可预期的结果。
vector和deque具有相似的接口,可以被用作相似的目的,但内部的工作机制有相当大的差距:vector使用一整个数组(来存储元素),当偶尔需要扩展容量时需要重新分配整个空间,而deque的元素是分布存储在多段不同的存储空间内,容器内部维护必要的信息,使得任意元素都可以通过一个统一连续的接口(迭代器)被直接访问,且访问所需的时间为常数。因此,deque内部的工作机制要比vector复杂,这也使得deque容器在某些情况下可以比vector更高效的扩展容量,尤其是当容器内存储着很长的数据序列,每一次重新分配空间(reallocation)都会有大量的开销时。
对于那些需要经常在容器前端与末端以外插入或删除元素的操作,相对于list(链表)和forward list(单链表),deque的性能更差,迭代器和引用(reference)的一致性也会更低*。
*译者:暂时也没明白这个一致性是怎么更低。
2. 容器属性
序列
容器中的元素是严格按照线性排列,每一个元素都可通过其在序列中所处的位置来访问。
动态数组
通常情况下是以动态数组的形式来实现。允许直接访问序列中的任何元素,并且在序列的前端与末端添加或删除元素都相对会更快。
分配器的使用
容器使用一个分配器(allocator)对象来动态的处理存储空间。
3. 模板参数
T
元素类型,与deque::value_type保持相同。
Alloc
分配器对象的类型,用来定义存储分配模型*。默认情况下这里会使用模板类allocator,它定义了一个最简单的存储分配模型并且是不依赖于具体的元素类型的。
*译者:原文用词比较文邹邹,其实分配器就是实现了动态的存储空间的分配与回收,当然了这里的分配与回收是与具体的元素类型紧密相关的,不同类型的元素,占用的空间不同,分配与回收操作自然也不同。
4. 成员类型
C++98
成员类型 | 定义 | 说明 |
value_type | 第一个模板参数(T) | |
allocator_type | 第二个模版参数(Alloc) | 默认值为:allocator<value_type> |
reference | allocator_type::reference | 对于默认的allocator,这个类型就是value_type& |
const_reference | allocator_type::const_reference | 对于默认的allocator,这个类型就是const value_type& |
pointer | allocator_type::pointer | 对于默认的allocator,这个类型就是value_type* |
const_pointer | allocator_type::const_pointer | 对于默认的allocator,这个类型就是const value_type* |
iterator | 一个value_type的随机访问迭代器 | 可被转换成const iterator |
const_iterator | 一个const value_type的随机访问迭代器 | |
reverse_iterator | reverse_iterator<iterator>(译者:iterator类型的反向迭代器) | |
const_reverse_iterator | reverse_iterator<const_iterator>(译者:只读iterator类型的反向迭代器) | |
difference_type | 有符号整型,与iterator_traits<iterator>::difference_type相同 | 通常就是ptrdiff_t |
size_type | 能够表示任何非负的difference_type值的无符号整型 | 通常就是size_t |
C++11
成员类型 | 定义 | 说明 |
value_type | 第一个模板参数(T) | |
allocator_type | 第二个模版参数(Alloc) | 默认值为:allocator<value_type> |
reference | value_type& | |
const_reference | const value_type& | |
pointer | allocator_traits<allocator_type>::pointer | 对于默认的allocator,这个类型就是value_type* |
const_pointer | allocator_traits<allocator_type>::const_pointer | 对于默认的allocator,这个类型就是const value_type* |
iterator | 一个value_type的随机访问迭代器 | 可被转换成const iterator |
const_iterator | 一个const value_type的随机访问迭代器 | |
reverse_iterator | reverse_iterator<iterator>(译者:iterator类型的反向迭代器) | |
const_reverse_iterator | reverse_iterator<const_iterator>(译者:只读iterator类型的反向迭代器) | |
difference_type | 有符号整型,与iterator_traits<iterator>::difference_type相同 | 通常就是ptrdiff_t |
size_type | 能够表示任何非负的difference_type值的无符号整型 | 通常就是size_t |
5. 成员函数
构造deque容器(公有成员函数)
deque的析构器(公有成员函数)
赋值运算(公有成员函数)
迭代器
返回指向容器前端(译者:就是指向第一个元素)的迭代器(公有成员函数)
返回指向容器末端(译者:就是指向最后一个元素)的迭代器(公有成员函数)
返回指向容器末端(译者:对于反向迭代器来说,这是第一个元素)的反向迭代器(公有成员函数)
返回指向容器前端(译者:对于反向迭代器来说,这是最后一个元素)的反向迭代器(公有成员函数)
返回指向容器前端的只读迭代器 (公有成员函数)
返回指向容器末端的只读迭代器(公有成员函数)
返回指向容器末端的只读反向迭代器 (公有成员函数)
返回指向容器前端的只读反向迭代器 (公有成员函数)
译者:这里的容器前端与末端分别指容器中的第一个与最后一个元素。只读迭代器本身可以进行增减操作来指向其它的元素,但是只读迭代器指向的元素是只读的。
容量
返回容器所包含的元素的数量 (公有成员函数)
返回容器最多能够包含的元素数量 (公有成员函数)
改变容器大小 (公有成员函数)
测试容器是否为空 (公有成员函数)
shrink_to_fit C++11
删除容器尚未使用的预分配空间* (公有成员函数)
*译者:出于性能上的考虑,当容器预分配的空间被新插入的元素消耗完之后,容器会再次预分配一定数量的存储空间,这样一来就不必在每次有新元素被插入时都重新分配空间。然而,预分配的空间如果不再被使用就会造成空间的浪费。shrink_to_fit方法可以释放这些尚未使用的预分配空间,同时保留所有元素的完整性。
访问元素
访问元素 (公有成员函数)
反问元素 (公有成员函数)
访问第一个元素 (公有成员函数)
访问最后一个元素 (公有成员函数)
修改
赋值给容器的内容 (公有成员函数)
在容器最后端插入元素 (公有成员函数)
在容器最前端插入元素 (公有成员函数)
删除最后一个元素 (公有成员函数)
删除第一个元素 (公有成员函数)
插入元素 (公有成员函数)
删除元素 (共有成员函数)
(与另一个容器)交换内容 (公有成员函数)
清空容器的内容 (公有成员函数)
emplace C++11
构造并且插入元素 (公有成员函数)
emplace_front C++11
构造并且在容器最前端插入元素 (公有成员函数)
emplace_back C++11
构造并且在容器最后端插入元素 (公有成员函数)
分配器
返回分配器 * (公有成员函数)
*译者:返回当前容器分配器的一个拷贝。通常情况下,分配器由容器本身调用,用户不需要关心。但当有特殊的设计需要时,可以调用方法get_allocator取得分配器对象,然后手动调用分配器进行容器存储空间的分配与回收。
6. 重载的非成员函数
deque的关系运算符 (函数)
交换两个deque容器的内容 (模板函数)
[翻译] C++ STL容器参考手册(第二章 <deque>)的更多相关文章
- [翻译] C++ STL容器参考手册 (总册)
1. 写在最前面 这将是博主的第一篇技术博客,思考再三决定从翻译开始.这将是一个系列的博客,由不同的章节组成,章节之间由超链接联系,开发过程将使用增量式开发,每次完成一个章节.本篇是本系列的总册,提供 ...
- [翻译] C++ STL容器参考手册(第一章 <array>)
返回总册 本章节原文:http://www.cplusplus.com/reference/array/array/ 1. std::array (C++11支持) template < cla ...
- [书籍翻译] 《JavaScript并发编程》 第二章 JavaScript运行模型
本文是我翻译<JavaScript Concurrency>书籍的第二章 JavaScript运行模型,该书主要以Promises.Generator.Web workers等技术来讲解J ...
- javascrit2.0完全参考手册(第二版) 第2章第4节 基本的数据类型
每一个变量都有一个确定的类型表明它存储什么样的数据.js基本的数据类型有strings字符串.numbers数字.Booleans布尔类型.字符串是使用双引号或单引号包含的一串字符:数字包括整数或浮点 ...
- javascrit2.0完全参考手册(第二版) 第2章第2节 语言特性
脚本执行顺序 js代码是按照它们在html中出现的顺序一行一行被解释的.这表明把函数定义和变量声明放到<head>中会很好.这保证了函数的代码和事件相关的处理程序不会立即执行. 大 ...
- javascrit2.0完全参考手册(第二版) 第1章第2节:javascript的历史和使用
javascript曾经带给人许多误解,例如如果你不了解它的历史,那么你可能困惑它和java有什么关系,其实它们一点关系都没有.网景公司1995年在Navigator 2.0 中引入这门语言时它叫Li ...
- javascrit2.0完全参考手册(第二版) 第1章第1节 在XHTML文档中增加javascript
通常,向文档中增加script脚本使用<script>元素,在HTML中增加脚本的方式有4中: (1)放到<script></script>块中: (2)<s ...
- javascrit2.0完全参考手册(第二版) 第2章第3节 变量
变量存储数据.每个变量都有一个名字,叫做标识符.在js中声明变量使用var关键字,var为新的数据分配存储空间,或者指示一直标识符正在使用.声明变量非常简单: var x; 这个语句告诉解释器一个新的 ...
- javascrit2.0完全参考手册(第二版) 第2章第1节 基本定义
在这里,我们介绍一些将要使用的编程语言术语.表2-1提供了精确定义的概念. Table 2-1: 编程语言的基本术语 名字 定义 例子 Token令牌 最小的不可分割的词汇的语言单位.一个连续的字符序 ...
随机推荐
- Go学习笔记(一):Ubuntu 环境下Go的安装
本文是根据<Go Web 编程>,逐步学习 Ubuntu 环境下go的安装的笔记. <Go Web 编程>的URL地址如下: https://github.com/astaxi ...
- 关于C函数的参数个数的问题
本文引自:http://c.biancheng.net/cpp/html/1592.html 一个函数的参数的数目没有明确的限制,但是参数过多(例如超过8个)显然是一种不可取的编程风格.参数的数目直接 ...
- Oracle 10g体系结构及安全管理
(1) Oracle数据库服务器:数据库,实例 (2) 数据库:(1)物理存储—数据文件,控制文件,日志文件,(2)逻辑存储—表空间,段,区间, ...
- 实现Web虚拟现实的最轻松方案—A-Frame框架
问题 随着vr的热度那么web虚拟现实是否可行 1. 实现Web虚拟现实的最轻松方案 A-Frame A-Frame是一款开源的可通过定制HTML元素构建WebVR方案的框架.有了这个框架,Web程序 ...
- nginx对于Yii2的前后台的配置
虽然是个基础问题,但也折腾了不少时间,记录下来,希望对新手有所帮助.例如我的前台地址yooao.cc,后台地址back.yooao.cc back.yooao.cc是yooao.cc的一个子域名. ...
- cobbler之ks文件示例
#platform=x86, AMD64, or Intel EM64T #version=DEVEL # Firewall configuration,关闭防火墙 firewall --disabl ...
- 了不起的分支和循环03 - 零基础入门学习Python009
了不起的分支和循环03 让编程改变世界 Change the world by program while循环 说完了分支我们来说说循环,标准的while循环语法我们已经可以熟悉掌握了. 这里我们就简 ...
- .net mvc结合微软提供的FormsAuthenticationTicket登陆
一.Web.config <system.web> <compilation debug="true" targetFramework="4.5&quo ...
- window系统查看端口被哪个进程占用
---恢复内容开始--- 1.在cmd窗口运行 netstat -ano | findstr 1099 找到进程PID 8408 杀死进程:taskkill -F -PID 8408 2.另外还找到进 ...
- iOS开发笔记--什么时候调用layoutSubviews
iOS开发笔记--什么时候调用layoutSubviews 分类: iOS2014-04-22 16:15 610人阅读 评论(0) 收藏 举报 今天在写程序时候遇见layoutSubviews触发时 ...