『C++之STL』双端队列 - deque

前言

双端队列,Double-ended queue,简称为deque是一种线性结构的一种容器;
在数据结构中出现的顺序表与链表,或者栈与队列都算是线性结构;
在结构中,它与vector相比较会相似一些;
但是在实际当中,双端队列 - deque 包含了vector与list的优点;

  • vector(顺序表)
    支持随机访问,空间连续;尾插尾删效率高,但是头部插入删除以及中间插入删除的开销过大,扩容代价高;
  • list(链表)
    任何位置的插入删除效率高,无扩容代价,但是内存碎片较多,且不支持随机访问;

而deque综合了上面两者部分的优点;

  • deque(双端队列)
    支持随机访问,头尾插入删除效率高,扩容代价低;

deque的结构

为什么双端队列 - deque既能支持头尾插入删除,又能支持下标随机访问?
这应该和它的结构有关;
在这里插入图片描述
deque的结构类似于vector,因为和vector一样,总体的框架为一个连续的物理空间;
但是与vector不同的是vector作为类模板容器,数据类型为 T;
而在这里deque所存储的其实为一个指针;
这个指针的类型为T*;
可以理解为一个数组内存储多个小数组从而达到对每个数据进行存储;
但是在结构中的起始位置,为了能便于支持头尾插入删除,初始的buff数组所在的位置并不是在deque总体框架的开头,而是在中间;


deque的接口设置

deque的接口设置与大部分的容器都相同;
在这里插入图片描述
在接口设置中较为相似list;
为什么说是list与vector的结合呢,还有一点;
在这里插入图片描述
deque重载了operator[];
这也是它可以对数据进行随机访问的一个原因;
那么有个问题,在如此复杂的条件下是怎么进行数据的随机访问?

可以进行假设;
假设存在一个大小为100的deque对象,其中每个buff小数组的大小为10,且100个数据中有3个头插的数据,现在需要去访问它的第25个数据应该怎么进行访问;
只需要2步即可:

用n减去头插的数据数个数(单独未满的buff数组数据个数)再除以数组总大小得是第几个buff数组;
即(25-3)/10;
再用n减去头插的数据数个数(单独未满的buff数组数据个数)再除0数组总大小得是buff数组中的第几个数据;
即(25-3)%10;


数据的插入删除

从上图中可以看出,若是需要进行头删头插或者尾删尾插时,只需要控制每个buff小数组即可;
由于初始buff数组所在位置处中间位置,所以可以更好的进行插入删除;

  • 头部插入删除
    第一次头插时只需要在指向首段buff的位置前再申请一块同样大小的空间即可;
    再进行头插的时候,由于是头插,需要数据从后往前插入;
    删除也为同样的操作;在这里插入图片描述
[如图所示,头插依次插入0,-1];
  • 尾部插入删除
    尾部插入删除与头部插入删除相同,若是该段buff数组已满,则需要新开一个buff小数组用于存储数据;
    删除也是如此;

  • 中间插入删除
    deque中较难的是这个在中间位置的插入删除;
    就如中间插入而言,deque的处理办法有两个办法,但是无论是哪个办法都会有缺点;
    但两点办法的总结也就是:
固定buff数组大小不固定buff数组大小
若是中间插入时固定buff数组大小,则在中间插入删除时需要大量的挪动数据,造成大量的开销若是中间插入时不固定buff数组大小,即在每次插入删除的时候,尤其是在插入时,扩容所对应的buff数组,该方法可以优化中间插入,使得在中间插入时不需要大量的挪动数据,但是对应的缺点是无法使用/配合%的方式进行下标的随机访问;

然而在STL的源码中所使用的方法为固定buff数组的大小,也就是抛弃了deque的中间插入删除;


双端队列的应用场景

在实际的应用场景中,使用到双端队列deque的场景并不多;
虽然它结合了vector的优点和list的优点,但是并没有十分的优异,换句话说就是无论是在效率上还是在有点伤都不能完全的取代vectorlist;
在STL中,栈与队列所采用的方式为适配器模式,它们的模板参数为:
template<class T , class Container = deque<T>>
在适配器模式中的模板参数Container默认为deque<T>,这也是双端队列中最经典的使用场景;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/106803.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3引入腾讯地图,点击坐标后实时获取经纬度

本文将介绍如何在Vue 引入腾讯地图组件&#xff0c;引入后可以直接在页面中渲染腾讯地图&#xff0c;实现 经纬度 与 地图锚点位置的双向绑定&#xff0c;如&#xff1a; 1&#xff0c;输入经纬度后&#xff0c;地图自动定位到指定位置&#xff1b;2&#xff0c;鼠标在地图点击…

多域名SSL数字证书是什么呢

多域名SSL数字证书是众多SSL数字证书中最灵活的一款SSL证书产品。一般一张SSL证书只能保护一个域名&#xff0c;即使能保护多个域名站点&#xff0c;证书保护的域名类型也有限制(通配符SSL数字证书)。多域名SSL数字证书既能用一张SSL证书保护多个域名网站&#xff0c;又不限制域…

HarmonyOS/OpenHarmony原生应用-ArkTS万能卡片组件Toggle

组件提供勾选框样式、状态按钮样式及开关样式。该组件从API Version 8开始支持。 仅当ToggleType为Button时可包含子组件。 一、接口 Toggle(options: { type: ToggleType, isOn?: boolean }) 从API version 9开始&#xff0c;该接口支持在ArkTS卡片中使用。 参数: Toggle…

基于Java的驾校教练预约管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

AD20绘制电路板的外形

今天学习了绘制电路板外形的方法&#xff0c;记录一下&#xff0c;回头忘了还能在看看&#xff0c;便能很快的回忆起来了&#xff0c;比看视频啥的要高效的多。毕竟是自己写的&#xff0c;印象要深刻的多。 首先新建一个PCBDoc文件&#xff0c;方法如下图&#xff1a; 在新建的…

Linux服务器快速搭建pytorch

Linux服务器搭建pytorch 文章目录 Linux服务器搭建pytorch一、使用FileZilla传输Anaconda二、激活Anaconda环境1.创建一个虚拟环境2.使用已有项目生成requirements.txt3.在虚拟环境中使用requirements.txt安装其他项目相关库 总结 一、使用FileZilla传输Anaconda 提示&#xf…

倍福TwinCAT3.0软件与C++通讯问题(EAP通讯)

文章目录 一. TwinCAT控制器之间的几种通讯方式1.添加EAP设备2.添加变量刷新的Task周期3. 测试 一. TwinCAT控制器之间的几种通讯方式 协议硬件要求实时性说明ADS通讯普通网卡&#xff0c;支持无线典型值&#xff1a;< 100msServer/Client&#xff0c;要写 PLC 程序&#x…

onlyoffice的介绍搭建、集成过程。Windows、Linux

文章目录 什么是onlyoffice功能系统要求安装必备组件 windows搭建资源下载安装数据库onlyoffice安装测试 Linux搭建dockerdocker-compose 项目中用到的技术&#xff0c;做个笔记哈~ 什么是onlyoffice 在本地服务器上安装ONLYOFFICE Docs Community Edition Community Edition…

网络安全—小白学习笔记

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟入…

AC修炼计划(AtCoder Regular Contest 165)

传送门&#xff1a;AtCoder Regular Contest 165 - AtCoder 本次习题参考了樱雪猫大佬的题解&#xff0c;大佬的题解传送门如下&#xff1a;Atcoder Regular Contest 165 - 樱雪喵 - 博客园 (cnblogs.com) A - Sum equals LCM 第一题不算特别难 B - Sliding Window Sort 2 对…

众和策略:小盘和大盘的关系?

在股票商场上&#xff0c;股票能够被分为小盘股和大盘股两类。那么&#xff0c;二者之间有什么联络呢&#xff1f;这篇文章将从多个视点来分析小盘和大盘的联络。 商场表现 首要&#xff0c;让我们看看两者在商场表现上的差异。大盘股是市值较大的股票&#xff0c;一般在首要股…

沉睡的木乃伊:var_export() 与可解析字符串

文章目录 参考环境var_export()概念应用场景数据持久化调试 函数 var_export() 自定义类__set_state() 魔术方法设置 __set_state 魔术方法的逻辑以复原对象注意事项 通用内置空类 stdClassstdClass对 __set_state() 的天然支持 参考 项目描述搜索引擎Bing、GoogleAI 大模型文…

Vue2+SpringBoot实现数据导出到csv文件并下载

前言 该功能用于导出数据到csv文件&#xff0c;并且前端进行下载操作。涉及到java后端以及前端。后端获取数据并处理&#xff0c;前端获取返回流并进行下载操作。csv与excel文件不大相同。如果对导出的数据操作没有很高要求的话&#xff0c;csv文件就够了。具体差异自行百度。我…

BootStrap-前端框架

资料:https://v3.bootcss.com/components/ BootStrap的概念&#xff08;Web框架&#xff09; Bootstrap&#xff0c;来自 Twitter&#xff0c;是目前很受欢迎的前端框架。Bootstrap 是基于 HTML、CSS、JavaScript 的&#xff0c;它简洁灵活&#xff0c;使得 Web 开发更加快捷。…

TLS/SSL 详解

目录 基础理论入门HTTPS对称加密非对称加密证书TLS握手过程握手总结 TLS 定义(记录层/握手层)HTTPS HTTP over TLS加密记录层分片 (Fragmentation)记录压缩和解压缩 (Record compression and decompression)空或标准流加密 (Null or standard stream cipher)CBC 块加密 (分组加…

C语言编译过程

最近在看C语言的基础知识&#xff0c;之前只关注编译最后生成的二进制文件&#xff0c;不知道编译过程&#xff0c;学习到了整理一下。 一、C语言编译过程 过程如下&#xff1a; 预编译---->编译---->汇编---->链接器输出---->二进制文件。 编译器将编译分为预…

出差学知识No3:ubuntu查询文件大小|文件包大小|磁盘占用情况等

1、查询单个文件占用内存大小2、显示一个目录下所有文件和文件包的大小3、显示ubuntu所有磁盘的占用情况4、查看ubuntu单个包的占用情况 1、查询单个文件占用内存大小 使用指令&#xff1a;ls -lh 文件 2、显示一个目录下所有文件和文件包的大小 指令&#xff1a;du -sh* 3…

【特纳斯电子】基于单片机的火灾监测报警系统-实物设计

视频及资料链接&#xff1a;基于单片机的火灾监测报警系统-实物设计 - 电子校园网 (mcude.com) 编号&#xff1a; T0152203M-SW 设计简介&#xff1a; 本设计是基于单片机的火灾监测报警系统&#xff0c;主要实现以下功能&#xff1a; 1.通过OLED显示温度、烟雾、是否有火…

Linux:Termius连接本地虚拟机与虚拟机快照

Termius连接本地虚拟机与虚拟机快照 1. Termius连接本地虚拟机2. 虚拟机快照与还原2.1 设置快照以及恢复 附录 1. Termius连接本地虚拟机 ifconfig -a 查看配置 连接成功 2. 虚拟机快照与还原 在学习阶段我们无法避免的可能损坏Linux操作系统。 如果损坏的话&#xff0c;重新…

PyTorch入门教学——在虚拟环境中安装Jupyter

1、简介 Jupyter Notebook是一个开源的web应用程序&#xff0c;可以使用它来创建和共享包含实时代码、方程、可视化和文本的文档。Jupyter Notebook是一个交互式笔记本&#xff0c;可以当作python编译器来使用。 2、安装 在安装Anaconda时是自带了Jupyter Notebook的&#x…