1.双端队列介绍

双端队列(dequeue) 与vector很类似,采用线性表顺序存储结构,且支持随机访问,即可以直接用下标来访问元素。但与vector有区别:

  • deque采用分块的线性存储结构来存储数据,每块的大小一般为512B,将之称为deque块;
  • 所有的deque块使用一个map块进行管理,每个map数据项记录各个deque块的首地址,所以允许较为快速的随机访问;
  • 即它不像vector 把所有的对象保存在一块连续的内存块,而是采用多个连续的存储块,并且在一个映射结构中保存对这些块及其顺序的跟踪;
  • 这样的话,deque块在头部和尾部都可以插入和删除,而不需要移动其他元素。
    • 1.使用push_back()方法在尾部插入元素,会扩张队列;
    • 2.使用push_front()方法在首部插入元素和使用insert()方法在中间插入元素(覆盖原有元素,不会增加新元素)。
  • 一般来说,当考虑到容器元素的内存分配策略和操作的性能时deque相当于vector更有优势。它是vector和list的结合,复杂度处于二者之间。

    复杂度
操作 复杂度
push_front() O(1)
pop_front() O(1)
push_back() O(1)
pop_back() O(1)
insert() O(n)
erase() O(n)
访问 O(1)

2.双端队列基本用法

2.1 dequeue的创建

与vector类似,deque<Type> d;

2.2 dequeue常见用法
操作 含义
a.push_back(e) 在尾部插入元素e,会不断扩张队列
a.push_front(e) 在头部插入元素e
a.pop_front() 在头部删除数据
a.pop_back() 在尾部删除数据
a.resize(num) 重新指定队列的长度
a.size() 返回容器中实际数据个数
a.max_size() //返回容器中最大数据的数量

简单测试代码:

#include<iostream>
#include<deque>
using namespace std;//用下标遍历队列
void showdeque1(deque<int>& d) {for (int i = 0; i < d.size(); i++) cout << d[i] << " ";cout << endl;
}
//用迭代器迭代队列
void showdeque2(deque<int>& d) {for (deque<int>::iterator it = d.begin(); it != d.end(); it++) cout << *it << " ";cout << endl;
}
int main()
{deque<int> d; //初始化一个双端队列//从尾部插入元素[1,2,3,4,5],会不断扩张队列for (int i = 1; i <= 5; i++) d.push_back(i);//遍历双端队列cout << "初始队列:";showdeque1(d);//从头部插入元素,会将另一头的元素出队d.push_front(6);d.push_front(7);//用迭代器迭代队列cout << "在头部插入6,7后的队列:";showdeque2(d);//在双端队列的头部删除元素d.pop_front();cout << "删除一个头部元素后:";showdeque1(d);//在双端队列的尾部删除元素d.pop_back();cout << "删除一个尾部元素后:";showdeque1(d);//从中间插入元素d.insert(d.begin() + 1, 100);cout << "在开头的第二个位置插入元素100:";showdeque1(d);//删除中间元素d.erase(d.end() - 2);cout << "删除倒数第二个元素:";showdeque1(d);cout << "size = " << d.size() << endl;//重新指定大小,容量增加默认值为0d.resize(6);cout << "扩容到size = 6 :";showdeque1(d);cout << "减少容量到size = 2:";d.resize(2); showdeque1(d);d.clear();cout << "清除容器后empty?" << d.empty() << endl;system("pause");return 0;
}

程序输出:

初始队列:1 2 3 4 5
在头部插入6,7后的队列:7 6 1 2 3 4 5
删除一个头部元素后:6 1 2 3 4 5
删除一个尾部元素后:6 1 2 3 4
在开头的第二个位置插入元素100:6 100 1 2 3 4
删除倒数第二个元素:6 100 1 2 4
size = 5
扩容到size = 6 :6 100 1 2 4 0
减少容量到size = 2:6 100
清除容器后empty?1

C++中STL容器之双端队列——dequeue相关推荐

  1. stl之deque双端队列容器

    deque与vector非常相似,不仅可以在尾部插入和删除元素,还可以在头部插入和删除.不过当考虑到容器元素的内存分配策略和操作性能时,deque相对vector较为有优势. 头文件 #include ...

  2. 【STL模板】双端队列

    Deque(双端队列) 双端队列(deque)是队列的一种变形,一般队列只能在队尾添加元素(push),在队首删除元素(pop),双端队列则同时在队首或者队尾执行添加和删除工作.C++中,使用双端队列 ...

  3. 双端队列 dequeue(python)

    #coding=utf-8class Deque(object):"""双端队列"""def __init__(self):self.__l ...

  4. STL源码剖析 序列式容器 deque双端队列

    相较于vector的内存拷贝,deque在内存不足时只需要进行内存的拼接操作即可,不需要重新配置.复制.释放等操作,代价就是迭代器的架构不是一个普通的指针,比较复杂 d e q u e 的迭代器 de ...

  5. 双端队列中的单调队列

    1. 双端队列 普通队列是限制仅在队尾进行插入,在队头进行删除操作的线性表,队列的插入叫做入队列,队列的删除叫做出队列. 而双端队列则是放开了这个限制,在队头和队尾两端都可以进行入队和出队操作的队列. ...

  6. 双端队列 BFS + Chamber of Secrets CodeForces - 173B

    题意: 一个 n×mn\times mn×m 的图,现在有一束激光从左上角往右边射出,每遇到 '#',你可以选择光线往四个方向射出,或者什么都不做,问最少需要多少个 '#' 往四个方向射出才能使光线在 ...

  7. Queue(队列)-Dequeue(双端队列)-Set-Map及迭代器 等相关方法

    一.队列Queue 1.是一个接口                     作用:使数据只能一端进,一端出.--先进先出,经常发生增删         2.LinkedList:就实现了此接口     ...

  8. STL源码剖析 stack 栈 概述->(使用deque双端队列 / list链表)作为stack的底层容器

    Stack是一种先进后出的数据结构,他只有一个出口 stack允许 新增元素.移除元素.取得最顶端的元素,但是无法获得stack的内部数据,因此satck没有遍历行为 Stack定义的完整列表 (双端 ...

  9. 【C++】STL常用容器总结之五:双端队列deque

    6.双端队列deque 所谓的deque是"double ended queue"的缩写,双端队列不论在尾部或头部插入元素,都十分迅速.而在中间插入元素则会比较费时,因为必须移动中 ...

最新文章

  1. 一文带你彻底了解Java异步
  2. Binder相关面试总结(一):为什么Android要采用Binder作为IPC机制?
  3. 请问如何更改dedecms“文件保存目录”的字符限制 ?
  4. 【错误记录】Kotlin 1.5.0 编译报错 ( 1.5.0 中 Float 不能直接转 Byte 类型 )
  5. 多线程:一个线程在运行时发生异常会怎么样?
  6. python自带的Mock模块使用
  7. ReactJS入门之Model分层的概念
  8. ibatis的简介与初步搭建应用
  9. springboot 启动器和监听器的加载
  10. [Usaco2009 Feb]Revamping Trails 堆优化 Dijkstra
  11. 简单工厂模式-Simple Factory Pattern
  12. 67. magento timezone
  13. Metasploit之——社会工程学工具包
  14. APP加壳原理及常用脱壳方法介绍
  15. golang 腾讯通用OCR 文字识别 Api 调用
  16. 解决微信端苹果手机无法跳转页面
  17. 温故而知新,可以为师矣
  18. 华图砖题库php文件怎么打印,可打印的题库
  19. 计算机主板上的SATA接口是串行接口,sata接口怎么接 小编为您系统整理方法步骤【图文】...
  20. Ctrl+H 浪潮Raid配置文档

热门文章

  1. Android Studio - Kotlin 改变控件字体
  2. 美国记者秘访Uber雇员:一代独角兽的衰落,谁来买单?
  3. 2022年最新微信小程序支付后端代码通俗易懂一篇文章让你了解微信支付
  4. 如何让GPT写出高质量小红书文案 ?
  5. Object.defineProperty 的实际应用
  6. 古典音乐与R数据分析
  7. STP生成树(2020.7.20)
  8. 满足70%项目需要,葛兰岱尔推出免费商用版3D/BIM/GIS引擎
  9. 【pygame游戏】
  10. 模拟电路设计(19)---多谐波振荡器