STL之双向队列

简介: STL之双向队列

1.deque


双端队列(dequeue) 采用线性表顺序存储结构,且支持随机访问,即可以直接用下标来访问元素,顾名思义其是双向开口,可以快速在首尾插入、删除数据。

其头文件是<deque>,主要包含函数:

push_back():在队尾压入元素

push_front():在队头压入元素

pop_back():删除最后一个元素

pop_front():删除第一个元素

front():返回第一个元素的引用

back():返回最后一个元素的引用

实际上双端队列的创建、访问、插入等操作和vector类似,如下:

#include<iostream>
#include<deque>
using namespace std;
int main()
{
  deque<int>a;
  a.push_back(1);
  a.push_back(2);
  a.push_front(0);
  deque<int>::iterator it;
  for(it=a.begin();it!=a.end();it++)//迭代器访问 
  cout<<*it<<endl;
  cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl;// 随机访问 
  return 0;
 }


注意的是增加数据最好用双端队列成员函数增加,不然迭代器不会更新。

关于其了解,我觉得最好还要通过和vector,queue等对比来加深。


2.与vector、queue、list对比


简单对比

名称      随机存取        中间插删             两端插删            迭代器
vector      快             复杂           尾端方便,前端复杂        有
deque      较快             复杂               两端方便            有
queue       否              无               仅尾入头删            无
list        否              简单                 方便             有


总的来说注意以下几点:

1.若需要随机访问操作,则选择vector;

2.若已经知道需要存储元素的数目,则选择vector;

3.若需要随机插入/删除(不仅仅在两端),则选择list

4.只有需要在首端进行插入/删除操作的时候,还要兼顾随机访问效率,才选择deque,否则都选择vector。

5.若既需要随机插入/删除,又需要随机访问,则需要在vector与list间做个折中-deque。

6.明显属于队列的问题才考虑queue。

相关文章
|
消息中间件 存储 监控
RabbitMQ 面试题及答案整理,最新面试题
RabbitMQ 面试题及答案整理,最新面试题
358 1
|
Java Spring 微服务
Spring 中优雅的获取泛型信息
简介 Spring 源码是个大宝库,我们能遇到的大部分工具在源码里都能找到,所以笔者开源的 mica 完全基于 Spring 进行基础增强,不重复造轮子。今天我要分享的是在 Spring 中优雅的获取泛型。
4222 0
|
9月前
开放·连接 ”2025玄铁 RISC-V 生态大会今日启动报名!
开放·连接 ”2025玄铁 RISC-V 生态大会今日启动报名
913 13
|
人工智能 自然语言处理 前端开发
还不懂如何与chatGPT高效交流?保姆级且全面的chatGPT提示词工程教程来啦!(二)进阶篇
这篇文章是chatGPT提示词工程的进阶教程,涵盖了加入鼓励词/行为词、拆分复杂需求、纠正反馈、使用英语提问、角色扮演、限定回答格式、多符咒结合以及参考其他人的提示词和使用提示词插件等技巧。
还不懂如何与chatGPT高效交流?保姆级且全面的chatGPT提示词工程教程来啦!(二)进阶篇
|
10月前
|
C语言 开发者
【C语言】数学函数详解
在C语言中,数学函数是由标准库 `math.h` 提供的。使用这些函数时,需要包含 `#include <math.h>` 头文件。以下是一些常用的数学函数的详细讲解,包括函数原型、参数说明、返回值说明以及示例代码和表格汇总。
294 6
|
12月前
ThreeJs手动控制动画播放与暂停
这篇文章介绍了如何在Three.js中手动控制动画的播放与暂停,包括设置动画混合器、监听按键事件以调整动画状态和速度的方法。
382 0
ThreeJs手动控制动画播放与暂停
|
11月前
|
Dart 安全 UED
Flutter&鸿蒙next中的表单封装:提升开发效率与用户体验
在移动应用开发中,表单是用户与应用交互的重要界面。本文介绍了如何在Flutter中封装表单,以提升开发效率和用户体验。通过代码复用、集中管理和一致性的优势,封装表单组件可以简化开发流程。文章详细讲解了Flutter表单的基础、封装方法和表单验证技巧,帮助开发者构建健壮且用户友好的应用。
228 0
|
测试技术 BI
性能基准测试基本流程
性能基准测试基本流程
248 1
|
机器学习/深度学习 搜索推荐 图形学
【论文精读】 SadTalker:Stylized Audio-Driven Single Image Talking Face Animation(CVPR2023)
【论文精读】 SadTalker:Stylized Audio-Driven Single Image Talking Face Animation(CVPR2023)
|
网络协议 Cloud Native Linux
云原生网络扫雷笔记:探究一条活跃连接却有TCP OOM的奇怪问题
本文联合作者 @牧原问题的背景某个名字很喜气的大客户的前线同学在一个傍晚找到了我们团队,反馈网络出现了严重的卡顿现象:“这个节点上所有的服务都很卡,扩容之后没几天还会出现!本来以为是AMD的问题,现在换了机型还是一样。”从客户的表述中我们已经了解到,在此之前他们做了很多的尝试,但是现象很明显:新节点调度业务Pod上去后,过一段时间就会出现。和机型没啥关系。随后客户反馈了一个比较关键的信息,他们有注
676 0
云原生网络扫雷笔记:探究一条活跃连接却有TCP OOM的奇怪问题