【C++ STL】Deques
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的更多相关文章
- CSP 201612-3 权限查询 【模拟+STL】
201612-3 试题名称: 权限查询 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 授权 (authorization) 是各类业务系统不可缺少的组成部分,系统用户通过授权 ...
- 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 ...
- (转)【C++ STL】细数C++ STL 的那些事 -- priority_queue(优先队列)
装载自http://blog.csdn.net/tianshuai1111/article/details/7652553 一,概述 priority_queue是拥有权值观念的queue,它允许加入 ...
- 【C++ STL】Set和Multiset
1.结构 set和multiset会根据特定的排序原则将元素排序.两者不同之处在于,multisets允许元素重复,而set不允许重复. 只要是assignable.copyable.comparab ...
- 【C++ STL】Map和Multimap
1.结构 Map和multimap将key/value pair(键值/实值 队组)当作元素,进行管理.他们根据key的排序准则将元素排序.multimap允许重复元素,map不允许. 元素要求: k ...
- 【C++ STL】容器概要
1.容器的共通能力 1. 所有的容器都是“value”语意,而不是“reference”语意.容器进行元素的安插操作时,内部实施的都是拷贝操作,置于容器内.因此STL容器的每个元素都必须能被拷贝.如 ...
- 【gcd+stl】UVa1642 Magical GCD
Description 一个长度为n的数列,选一个连续子序列,使得子序列的公约数*长度最大,求这个最大值.n<=1e5. Solution 连续子序列一般都要用滑动窗口是吧(固定r,快速计算最优 ...
- 2017CCPC秦皇岛 C题Crusaders Quest&&ZOJ3983【模拟+STL】
链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3983 题意: 给定9个血槽,有三种物品,每次可以把连续相同的物品抵消 ...
- 【C++ STL】Queue
1.定义 class queue<>实作为一个queue(也成为FIFO,先进先出).可以使用push()将任意数量的元素置入queue中,也可以使用pop()将元素以其插入顺序从容器中移 ...
随机推荐
- js中的数组对象排序
一.普通数组排序 js中用方法sort()为数组排序.sort()方法有一个可选参数,是用来确定元素顺序的函数.如果这个参数被省略,那么数组中的元素将按照ASCII字符顺序进行排序.如: var ar ...
- TCP系列40—拥塞控制—3、慢启动和拥塞避免概述
本篇中先介绍一下慢启动和拥塞避免的大概过程,下一篇中将会给出多个linux下reno拥塞控制算法的wireshark示例,并详细解释慢启动和拥塞避免的过程. 一.慢启动(slow start) 一个T ...
- asp.net 后台注册(调用)JS
1.使用Page.ClientScript.RegisterClientScriptBlock 使用 Page.ClientScript.RegisterClientScriptBlock可以防止ja ...
- 【beta】Scrum站立会议第1次....11.3
beta阶段,我们nice!团队将进行为期两周的冲刺,Scrum站立会议10次. 小组名称:nice! 组长:李权 成员:于淼 刘芳芳韩媛媛 宫丽君 项目内容:约跑app(约吧) 时间:2016.1 ...
- PAT 1035 插入与归并
https://pintia.cn/problem-sets/994805260223102976/problems/994805286714327040 据维基百科的定义: 插入排序是迭代算法,逐一 ...
- 【Redis】- 总结精讲
本文围绕以下几点进行阐述 1.为什么使用redis2.使用redis有什么缺点3.单线程的redis为什么这么快4.redis的数据类型,以及每种数据类型的使用场景5.redis的过期策略以及内存淘汰 ...
- 在html在添加cookie和读取cookie
1.保存cookie var oDate = new Date(); oDate.setDate(oDate.getDate() + );//有效期为30天 document.cookie = &qu ...
- BZOJ 1806 矿工配餐(DP)
很水的DP. 因为每一个餐车的加入只需要知道当前矿洞的前两个餐车种类就行了.而餐车一共就三种. 所以令dp[i][Sa][Sb]表示前i辆餐车送餐完毕后第一个矿洞的前两个餐车种类为Sa,第二个矿洞的前 ...
- BZOJ 1045 糖果传递(思维)
设第i个人给了第i+1个人mi个糖果(可以为负),因为最后每个人的糖果都会变成sum/n. 可以得到方程组 mi-mi+1=a[i+1]-sum/n.(1<=i<=n). 把方程组化为mn ...
- 《转》vue-cli的webpack模板项目配置文件注释
一.文件结构 本文主要分析开发(dev)和构建(build)两个过程涉及到的文件,故下面文件结构仅列出相应的内容. ├─build │ ├─build.js │ ├─check-versions.js ...