[翻译] 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的析构器(公有成员函数)

=运算符

  赋值运算(公有成员函数)

迭代器

begin

  返回指向容器前端(译者:就是指向第一个元素)的迭代器(公有成员函数)

end

  返回指向容器末端(译者:就是指向最后一个元素)的迭代器(公有成员函数)

rbegin

  返回指向容器末端(译者:对于反向迭代器来说,这是第一个元素)的反向迭代器(公有成员函数)

rend

  返回指向容器前端(译者:对于反向迭代器来说,这是最后一个元素)的反向迭代器(公有成员函数)

cbegin

  返回指向容器前端的只读迭代器 (公有成员函数)

cend

  返回指向容器末端的只读迭代器(公有成员函数)

crbegin

  返回指向容器末端的只读反向迭代器 (公有成员函数)

crend

  返回指向容器前端的只读反向迭代器 (公有成员函数)

译者:这里的容器前端与末端分别指容器中的第一个与最后一个元素。只读迭代器本身可以进行增减操作来指向其它的元素,但是只读迭代器指向的元素是只读的。

容量

size

  返回容器所包含的元素的数量 (公有成员函数)

max_size

  返回容器最多能够包含的元素数量 (公有成员函数)

resize

  改变容器大小 (公有成员函数)

empty

  测试容器是否为空 (公有成员函数)

shrink_to_fit C++11

  删除容器尚未使用的预分配空间* (公有成员函数)

*译者:出于性能上的考虑,当容器预分配的空间被新插入的元素消耗完之后,容器会再次预分配一定数量的存储空间,这样一来就不必在每次有新元素被插入时都重新分配空间。然而,预分配的空间如果不再被使用就会造成空间的浪费。shrink_to_fit方法可以释放这些尚未使用的预分配空间,同时保留所有元素的完整性。

访问元素

运算符[]

  访问元素 (公有成员函数)

at

  反问元素 (公有成员函数)

front

  访问第一个元素 (公有成员函数)

back

  访问最后一个元素 (公有成员函数)

修改

assign

  赋值给容器的内容 (公有成员函数)

push_back

  在容器最后端插入元素 (公有成员函数)

push_front

  在容器最前端插入元素 (公有成员函数)

pop_back

  删除最后一个元素 (公有成员函数)

pop_front

  删除第一个元素 (公有成员函数)

insert

  插入元素 (公有成员函数)

erase

  删除元素 (共有成员函数)

swap

  (与另一个容器)交换内容 (公有成员函数)

clear

  清空容器的内容 (公有成员函数)

emplace C++11

  构造并且插入元素 (公有成员函数)

emplace_front C++11

  构造并且在容器最前端插入元素 (公有成员函数)

emplace_back C++11

  构造并且在容器最后端插入元素 (公有成员函数)

分配器

get_allocator

  返回分配器 * (公有成员函数)

*译者:返回当前容器分配器的一个拷贝。通常情况下,分配器由容器本身调用,用户不需要关心。但当有特殊的设计需要时,可以调用方法get_allocator取得分配器对象,然后手动调用分配器进行容器存储空间的分配与回收。

6. 重载的非成员函数

关系运算符

  deque的关系运算符 (函数)

swap

  交换两个deque容器的内容 (模板函数)

时间: 2024-10-06 04:24:18

[翻译] C++ STL容器参考手册(第二章 <deque>)的相关文章

[翻译] C++ STL容器参考手册 (总册)

1. 写在最前面 这将是博主的第一篇技术博客,思考再三决定从翻译开始.这将是一个系列的博客,由不同的章节组成,章节之间由超链接联系,开发过程将使用增量式开发,每次完成一个章节.本篇是本系列的总册,提供了所有子章节的超链接,另外所有的子章节也都将提供链接返回到本篇. 2. 本系列的目录结构 总册 第一章 <array> 第二章 <deque> 第三章 <forward_list> 第四章 <list> 第五章 <map> 第六章 <queue

[翻译] C++ STL容器参考手册(第一章 &lt;array&gt;)

返回总册 1. std::array (C++11支持) template < class T, size_t N > class array; 数组类 数组容器是固定长度的序列容器:按照严格的线性顺序,存储一定数量的元素. 数组容器内部并不维护除了元素本身之外的任何数据(甚至不保存自己的size,这是一个编译时就确定的模板参数).数组容器对存储空间的利用效率和普通数组一样高.数组类仅仅在数组之外增加了一些成员以及全局函数,使得这些数组能够被当作一个标准容器来使用. 与其他的标准容器不同的是,

IIS 7开发与管理完全参考手册(第二章 IIS的发展历史)

p29~p49, 分2次看.p29~p37, p38~p49. 摘要 本章讲述了IIS的发展历程 IIS1~3几乎无变化 IIS4添加了进程隔离 IIS5提供了3种应用程序保护(单进程, 程序池, 进程隔离) IIS6增加了工作进程模式, 可以运行多个应用程序池, 引入了在内核模式运行的Http.sys IIS7将IIS管道和ASP.NET管道统一, 管道中可添加自定义组件 IIS4及以前 IIS1除了可以处理静态内容请求, 还提供了ISAPI(Internet Service Applicat

我要翻译《Think Python》- 004 第二章 变量, 表达式和语句

PDF源文件地址 :  http://www.greenteapress.com/thinkpython/thinkpython.pdf [自述:这一章内容不多,但是由于时间关系,翻译完成这一章也花了我一周的时间,跟我预想的进度相比已经落后了,得加油了,要不然翻译完整本书就要到猴年马月了.目前离翻译完成还有17章!!!] 第二章 变量, 表达式和语法 2.1 值和类型 值是程序工作的基本要素,如字符串“Hello,World!”或数字1.2等等. 这些值属于不同类型:2是一个整数,而“Hello

[书籍翻译] 《JavaScript并发编程》 第二章 JavaScript运行模型

本文是我翻译<JavaScript Concurrency>书籍的第二章 JavaScript运行模型,该书主要以Promises.Generator.Web workers等技术来讲解JavaScript并发编程方面的实践. 完整书籍翻译地址:https://github.com/yzsunlei/javascript_concurrency_translation .由于能力有限,肯定存在翻译不清楚甚至翻译错误的地方,欢迎朋友们提issue指出,感谢. 本书第一章我们探讨了JavaScri

STL学习笔记(第二章 C++及其标准程序库简介)

本章重点是介绍与C++标准程序库相关的几个最重要的语言新特性 template(模板) 程序库中几乎所有东西都被设计成template形式.所谓templates,是针对“一个或多个尚未明确的性别”所撰写的函数或类别. 下面是一个典型例子 template<class T> inline const T& max(const T& a,const T& b) { return a < b ? b : a; { template并非一次编译便产生出社和所有型别的代码

IIS 7开发与管理完全参考手册(第一章部分内容)

在CSAPP中看到Web Server的部分内容, 联想到经常使用IIS, 所以准备了解一点. p9~p15. IIS7特性 管道集成 IIS 7.0将ASP.NET与请求管道进行了集成, IIS 7提供了统一的事件管道, 之前有一个2种独立的管道-- IIS管道和ASP.NET管道. 为了向后兼容, IIS 7提供了Classic管道模式, 可以模拟IIS 6.0的IIS管道, 也可模拟IIS 6.0的ASP.NET管道. IIS6 请求流程 浏览器 -> (IIS管道) HTTP.SYS -

ACM常用STL容器

1 // STL(标准模板库),由三大部分组成:容器,算法,迭代器 2 3 4 // STL六大组件:container(容器),algorthm(算法),iterator(迭代器) 5 // function object(仿函数),adaptor(适配器),allocator(空间适配器) 6 7 // STL容器 8 9 // vector 10 // deque(双端数组) 11 // stack 12 // queue 13 // list(链表模型) 14 // priotry_qu

《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型 (转)

第二章 实体数据建模基础 很有可能,你才开始探索实体框架,你可能会问“我们怎么开始?”,如果你真是这样的话,那么本章就是一个很好的开始.如果不是,你已经建模,并在实体分裂和继承方面感觉良好,那么你可以跳过本章. 本章将带你漫游使用实体框架建模的基本实例,建模是实体框架的核心特性,同时也是区别实体框架和微软早期的数据访问平台的特性.一旦建好模,你就可以面向模型编写代码,而不用面向关系数据库中的行和列. 本章以创建一个简单概念模型的实例开始,然后让实体框架创建底层的数据库,剩下的实例,将向你展示,如