1、结构

  容器deque和vector非常相似,也是采用动态数组来管理元素,提供随机存取,有着和vector几乎一样的接口,不同的是deque的动态数组头尾都开放,因此可以在头尾都可以进行快速的安插和删除。

  为了获取这种能力,deque通常实作为一组独立区块,第一区块朝某方向扩展,最后一区块朝另一方向扩展。

2、deque能力

2.1 与vector区别

  两端都能快速安插和删除元素。

  存取元素时,deque内部结构会多一个间接的过程,所以存取和迭代器的动作会稍微慢一些。

  迭代器需要在不同的内存区块跳转,所以必须是特殊的智能型指针,非一般指针。

  deque不支持对容量和内存重分配时机的控制,除了头尾两端,在任何地方删除或者增加元素都会使reference、pointers、iterators失效。deque的内存分配优于vector,由其内部可知,deque不必在内存重新分配时复制所有元素。

  deque的内存区块不再被使用时,会被释放。deque的内存大小是可缩减的。

2.2 与vector的共同点

  在中段部分安插、移除元素的速度相对较慢,因为所有的元素都需要移动或者腾出填补空间。

  迭代器属于random access iterator(随机存取迭代器)。

2.3 适用场景

  需要在两段安插或者删除元素

  无需引用容器内的元素

  要求释放不再使用的元素。

3、操作函数

3.1 构造函数和析构函数

操作

效果

deque<Elem> c

产生一个空的deque

deque<Elem> c1(c2)

针对某个同型deque产生一个副本(所有元素都被拷贝)

deque<Elem> c(n)

产生一个包含n个元素的deque,这些元素均以default构造函数产生。

deque<Elem> c(n,elem)

产生一个包含n个元素的deque,这些元素均是elem的副本

deque<Elem> c(beg,end)

产生一个deque,以区间[beg,end)内的元素作为初值

c.~deque<Elem>()

销毁所有元素,释放内存

3.2 非变动操作

操作

效果

c.size()

返回当前的元素数量

c.empty()

判断大小是否为零,等同于0 == size(),效率更高

c.max_size()

返回能容纳的元素最大数量

c1 == c2

判断c1是否等于c2

c1 != c2

判断c1是否不等于c2(等同于!(c1==c2))

c1 < c2

判断c1是否小于c2

c1 > c2

判断c1是否大于c2

c1 <= c2

判断c1是否小于等于c2(等同于!(c2<c1))

c1 >= c2

判断c1是否大于等于c2 (等同于!(c1<c2))

c.at(idx)

返回索引idx所标示的元素,如果idx越界,抛出out_of_range

c[idx]

返回索引idx所标示的元素,不进行范围检查

c.front()

返回第一个元素,不检查第一个元素是否存在

c.back()

返回最后一个元素,不检查最后一个元素是否存在

c.begin()

返回一个随机存取迭代器,指向第一个元素

c.end()

返回一个随机存取迭代器,指向最后一个元素的下一个位置

c.rbegin()

返回一个逆向迭代器,指向逆向迭代的第一个元素

c.rend()

返回一个逆向迭代器,指向逆向迭代的最后一个元素的下一个位置

3.3变动性操作

操作

效果

c1 = c2

将c2所有的元素赋值给c1

c.assign(n,elem)

将n个elem元素的副本赋值给c

c.assign(beg,end)

将区间[beg,end)所有的元素赋值给c

c1.swap(c2)

c1和c2的元素互换

swap(c1,c2)

c1和c2的元素互换,全局函数

c.insert(pos,elem)

在pos位置安插一个elem副本,返回新元素的位置

c.insert(pos,n,elem)

在pos位置安插n个elem副本,无返回值

c.insert(pos,beg,end)

在pos位置安插区间[beg,end)所有元素的副本,无返回值

c.push_back(elem)

在尾部添加一个elem副本

c.pop_back()

移除最后一个元素

c.push_front(elem)

在头部添加一个elem元素副本

c.pop_front()

移除头部元素

c.erase(pos)

移除pos位置上的元素,返回下一个元素的位置

c.erase(beg,end)

移除区间[beg,end)所有的元素,返回下一个元素的位置

c. resize(num)

将大小(元素个数)重置为num个,如果size()增大,新增元素都已default构造函数构造出来

c.resize(num, elem)

将大小(元素个数)重置为num个,如果size()增大,新增元素都是elem的副本

c.clear()

移除所有元素,容器清空

3.4 注意

  deque不提供容量操作(capacity(),reserve())

  deque提供之间函数,完成头部的删除(pop_front())和插入(push_front ())操作。

   除了at(),没有任何成员函数会检查索引或者迭代器是否有效。

  元素的插入和删除可能导致内存的重新分配,所以任何插入和删除的动作都可能使所有指向deque元素的pointers、reference、iterators失效。唯一例外的是在头部或尾部插入元素,pointers和reference依然有效,但是iterators会失效。

4、示例代码

// cont/deque1. cpp

   #include <iostream>
#include <deque>
#include <string>
#include <algorithm>
using namespace std; int main()
{ //create empty deque of strings
deque<string> coll; //insert several elements
coll.assign (, string("string"));
coll.push_back ("last string");
coll.push_front ("first string"); //print elements separated by newlines
copy (coll.begin(), coll.end(),
ostream_iterator<string>(cout,"\n"));
cout << endl; //remove first and last element
coll.pop_front();
coll.pop_back(); //insert ''another'' into every element but the first
for (int i=; i<coll.size(); ++i) {
coll[i] = "another " + coll [i]; } //change size to four elements
coll.resize (, "resized string"); //print elements separated by newlines
copy (coll.begin(), coll.end(),
ostream_iterator<string>(cout,"\n")); }

输出:

   first string
string
string
string
last string string
another string
another string
resized string

【C++ STL】Deques的更多相关文章

  1. CSP 201612-3 权限查询 【模拟+STL】

    201612-3 试题名称: 权限查询 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 授权 (authorization) 是各类业务系统不可缺少的组成部分,系统用户通过授权 ...

  2. Educational Codeforces Round 34 B. The Modcrab【模拟/STL】

    B. The Modcrab time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  3. (转)【C++ STL】细数C++ STL 的那些事 -- priority_queue(优先队列)

    装载自http://blog.csdn.net/tianshuai1111/article/details/7652553 一,概述 priority_queue是拥有权值观念的queue,它允许加入 ...

  4. 【C++ STL】Set和Multiset

    1.结构 set和multiset会根据特定的排序原则将元素排序.两者不同之处在于,multisets允许元素重复,而set不允许重复. 只要是assignable.copyable.comparab ...

  5. 【C++ STL】Map和Multimap

    1.结构 Map和multimap将key/value pair(键值/实值 队组)当作元素,进行管理.他们根据key的排序准则将元素排序.multimap允许重复元素,map不允许. 元素要求: k ...

  6. 【C++ STL】容器概要

    1.容器的共通能力 1.  所有的容器都是“value”语意,而不是“reference”语意.容器进行元素的安插操作时,内部实施的都是拷贝操作,置于容器内.因此STL容器的每个元素都必须能被拷贝.如 ...

  7. 【gcd+stl】UVa1642 Magical GCD

    Description 一个长度为n的数列,选一个连续子序列,使得子序列的公约数*长度最大,求这个最大值.n<=1e5. Solution 连续子序列一般都要用滑动窗口是吧(固定r,快速计算最优 ...

  8. 2017CCPC秦皇岛 C题Crusaders Quest&&ZOJ3983【模拟+STL】

    链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3983 题意: 给定9个血槽,有三种物品,每次可以把连续相同的物品抵消 ...

  9. 【C++ STL】Queue

    1.定义 class queue<>实作为一个queue(也成为FIFO,先进先出).可以使用push()将任意数量的元素置入queue中,也可以使用pop()将元素以其插入顺序从容器中移 ...

随机推荐

  1. BZOJ 3924 ZJOI2015 幻想乡战略游戏 树链剖分

    题目链接:https://www.luogu.org/problemnew/show/P3345(bzoj权限题) 题意概述:动态维护树的上所有点到这棵树的带权重心的距离和.N,Q<=10000 ...

  2. iostat lsof

    转至:http://www.51testing.com/html/48/202848-242043.html 命令总结: 1. top/vmstat 发现 wa%过高,vmstat b >1: ...

  3. CSS3制作各种形状图像(转)

    CSS3制作各种形状图像 浏览:1417 | 更新:2015-05-24 14:43 | 标签:css 1 2 3 4 5 6 7 分步阅读 圆形-椭圆形-三角形-倒三角形=左三角形-右三角形-菱形- ...

  4. Ubuntu16.04修改IP

    首先用root用户登陆,然后输入你root的密码.如下图:   然后编辑interfaces文件,该文件位于/etc/network/下,执行如下命令: vim /etc/network/interf ...

  5. lintcode-34-N皇后问题 II

    34-N皇后问题 II 根据n皇后问题,现在返回n皇后不同的解决方案的数量而不是具体的放置布局. 样例 比如n=4,存在2种解决方案 标签 递归 思路 参考http://www.cnblogs.com ...

  6. 无法启动此程序,因为计算机中丢失 zlibd.dll【OSG】

    在配置OSG的过程中遇到了这个问题.记录一下. zlibd.dll这个DLL可以在第三方库3rdParty里面找到.找到之后复制到OSG的bin目录下即可.

  7. udp->ip & tcp->ip 发送数据包的目的地址的源地址是什么时候确定的?

    udp->ip & tcp->ip udp到ip层是:ip_send_skb tcp到ip层是: ip_queue_xmit 拿tcp为例,在使用[ip_queue_xmit, i ...

  8. 关闭或者开启apache的目录浏览

    为了安全或者方便需要关闭或者开启apache的目录浏览   关闭目录浏览    修改http.conf 文件    Options Indexes FollowSymLinks     改为      ...

  9. BZOJ 1221 软件开发(费用流)

    容易看出这是显然的费用流模型. 把每天需要的餐巾数作为限制.需要将天数拆点,x’表示每天需要的餐巾,x’’表示每天用完的餐巾.所以加边 (s,x',INF,0),(x'',t,INF,0). 餐巾可以 ...

  10. [牛客Wannafly挑战赛27D]绿魔法师

    description newcoder 给你一个空的可重集合\(S\). \(n\)次操作,每次操作给出\(x\),\(k\),\(p\),执行以下操作: \(opt\ 1\):在S中加入x. \( ...