『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,一经查实,立即删除!

相关文章

1.12.C++项目:仿muduo库实现并发服务器之LoopThreadPool模块的设计

文章目录 一、LoopThreadPool模块二、实现思想&#xff08;一&#xff09;功能&#xff08;二&#xff09;意义&#xff08;三&#xff09;功能设计 三、代码 一、LoopThreadPool模块 1.线程数量可配置&#xff08;0或多个&#xff09; 2. 对所有的线程进行管理&#xff0c;其…

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

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

MySQL InnoDB存储引擎的缓冲池和内存性能

MySQL数据库的InnoDB存储引擎详细记录了其缓冲池(Buffer Pool)和内存(Memory)的统计信息&#xff0c;这些信息在分析数据库性能和进行优化时非常重要。这些信息可以通过语句以下查询获取。 SHOW ENGINE INNODB STATUS; 本文将对这些统计信息进行介绍&#xff0c;并给出优化建…

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

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

pg ash自制版 pg_active_session_history

一、 实现功能 由于pgsentinel插件存在严重的内存占用问题&#xff0c;本篇改为自行实现&#xff0c;但其语句仍可以参考pgsentinel插件。PostgreSQL ash —— pgsentinel插件 学习与踩坑记录_CSDN博客 v1.0 根据pg 14版本设计及测试&#xff0c;仅支持收集主库信息。默认每10秒…

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…

Python 提取加密的 PDF 中的文字

依赖 Python 库&#xff1a;fitz $ python -m pip install fitz注&#xff1a;如果运行下述脚本过程中遇到 No module named frontend&#xff0c;可执行 python -m pip install frontend&#xff08;要求 Python >3.8&#xff09;或 python -m pip install PyMuPDF Pyth…

AD20绘制电路板的外形

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

微信小程序canvas画布绘制base64图片并保存图片到相册中

WXML部分&#xff1a; <view class"img_" style"width: 100%;"><canvas type"2d" id"canvasId" style"width: 100%;height: 100%" ></canvas> <button style"margin: auto;width: 70%;marg…

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…

ROS | 新建工作空间及功能包

文章目录 概述一、操作教程1.创建工作空间2.创建功能包3.新建程序文件4.编写CMakeLists5.编译功能包6.运行节点概述 本节详细介绍了如何新建一个工作空间、功能包以及在功能包中如何创建程序文件并编译。 一、操作教程 1.创建工作空间 mkdir -p 自定义空间名称/src cd 自定义…

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 大模型文…

Python 的基本数据类型

三、Python 的基本数据类型 1、字符串 字符串英文 string ,是 python 中随处可见的数据类型,字符串的识别也非常的简单,就是用「引号」括起来的。 引号包括单引号 ,双引号 " " 和 三引号 ,比如 abc ,"123" 等等。 这里请注意,单引号 或双引…

Python- JSON-RPC创建一个远程过程调用

我们使用JSON-RPC创建一个远程过程调用的例子&#xff0c;我们将使用jsonrpcserver库和Flask框架创建一个后端服务&#xff0c;并使用jsonrpcclient作为客户端。这个例子将包括&#xff1a; 一个计算服务&#xff0c;提供加、减、乘、除四个方法。错误处理&#xff1a;除数为零…