【C++】deque双端队列

news2024/11/29 6:24:49

目录

  • deque的原理介绍
  • deque的优点和缺陷

deque的原理介绍

1.deque(双端队列):是一种双开口的“连续”空间的数据结构,双开口的含义是:在头尾两端都可以进行插入和删除操作,且时间复杂度为O(1)。
在这里插入图片描述
需要注意的是deque并不是真正连续的空间,不是像vector那样底层是连续空间的数组,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组,为了管理分段空间,deque容器引入了map,称之为中控器,map是一块连续的空间,其中每个元素是指向缓冲区buffer的指针,缓冲区才是deque存储数据的主体,其底层结构如下图所示:
在这里插入图片描述
2.双端队列底层是一段假象的连续空间,实际上是分段连续的,为了维护其“整体连续”以及随机访问的假象,落在了deque的迭代器上,因此deque的迭代器就比较复杂,如下图所示:
在这里插入图片描述
中控器包含了map size,指向buffer的指针,deque的开始迭代器与结尾迭代器。

_Tp **_M_map;
size_t _M_map_size;
iterator _M_start;
iterator _M_finish;

deque的优点和缺陷

在了解deque双端队列的优缺点之前,我们先学习一下vector和list的优缺点,有助于更好的比对。

vector的优点

  • 尾插尾删效率很高
  • 支持随机访问(利用下标访问)
  • 相比链表结构。顺序表CPU高速缓存命中率更高(因为顺序表的底层由数组实现,物理地址是连续的)

vector的缺点

  • 头部和中部插入删除效率低(O(N))
  • 扩容:存在性能消耗和空间上的浪费

list的优点

  • 任意位置插入删除效率很高。(O(1))
  • 按需申请和释放,优化了vector在空间上的浪费

list的缺点

  • CPU高速缓存的命中率不高(物理地址空间不连续)
  • 不支持随机访问

deque的优点

与vector比较,deque的优势是:头部插入删除时,不需要搬移元素,效率高,而且在扩容时,也不需要搬移大量的元素。因为deque在头部插入删除的时候,是直接在前面开一块空间(缓冲区buffer)插入元素的,尾插同理,在后面开空间。
与list比较,deque的底层是连续空间,空间利用率比较高,不需要存储额外的字段。

deque的缺点

  • 不适合遍历及排序
    因为在遍历时,deque的迭代器要频繁的去检测其是否移动到某段小空间的边界,导致效率低下**,并且deque的迭代器非常复杂,deque维护了两个迭代器,start指向第一个缓冲区的第一个元素,finish指向最后一个缓冲区的最后一个元素的下一个位置,cur指向迭代器所指缓冲区的当前元素,first指向迭代器所指缓冲区第一个元素,last指向迭代器所指缓冲区的最后一个元素,node指向中控,当cur等于last,说明本段空间已被使用完毕,通过node++找到中控数组中下一段内存空间的地址(见下图)。而序列式场景中,可能需要经常遍历,因此在实际中,需要线性结构时,大多数情况下优先考虑vector和list,deque的应用场景并不多,而目前能看到的一个应用就是,STL用其作为stack和queue的底层数据结构。

  • 中间插入删除数据不如list
    从deque的底层结构图中可以看出,中间插入、删除数据仍会产生数据的挪动。

  • 随机访问速度不如vector
    由于deque的中控数组中指向的一段地址空间之间并不连续,所以随机访问时需要计算目标数据处于哪段buffer中的第几个数据。计算方式与磁盘定位扇区类似(LBA地址转化为CHS地址)。

在这里插入图片描述

为什么选择deque作为stack和queue的底层默认容器?

1.stack和queue不需要遍历(因此stack和queue没有迭代器),只需要在固定的一端或者两端进行操作;
2.在stack和queue中,元素增长时,deque和vector相比,deque效率更高(扩容时不需要搬移大量数据),内存使用率更高。

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

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

相关文章

制作一个微信小程序步骤_分享个人微信小程序开发步骤

微信小程序的功能不断提高,以及用户对小程序的使用的增加,使得新一批的流量融入小程序中,越开越多的企业开始开发小程序,想要从中分一碗羹,今天内容就从如何制作一个微信小程序说起,希望对你有帮助。微信小…

Vue鼠标移入移出事件(冒泡问题)

一、定义1、mouseenter:在鼠标光标从元素外部首次移动到元素范围之内时触发,这个事件不冒泡。2、mouseleave:在位于元素上方的鼠标光标移动到元素范围之外时触发,这个事件不冒泡。3、mouseover:在鼠标指针位于一个元素…

Flink学习31:Table API SQL之注册表

table API tableAPI & flink SQL flink SQL是最上层的封装,封装了流处理的DataStream API 和 批处理的DataSet API。 但是DataStream API 、DataSet API、table API、flink SQL 这几层并没有分到不同层中,所以应用程序可以同时使用这几层。 Table A…

合合信息——用智能文字识别技术赋能古彝文原籍数字化

文章目录1. 背景介绍:古彝文是什么?为什么要保护它?如何保护它?2. 传统方法保护古彝文:原籍难获、翻译困难2.1. 古彝文原籍的破损与古法保存2.2 古彝文原籍的保护与翻译2.2.1 获取古彝文原籍2.2.2 修复古彝文原籍2.2.3…

ansible作业一

配置ansible学习环境实现以下要求 1.控制主机和受控主机通过root用户通过免密验证方式远程控住受控主机实施对应(普通命令,特权命令)任务 2.控制主机连接受控主机通过普通用户以免密验证远程控住受控主机实施指定(普通命令&#x…

Makefile快速入门

介绍 这里以一个例子来演示利用Makfile进行多文件编译 一共有四个源程序&#xff1a;main.cpp&#xff0c;printhello.cpp&#xff0c;factorial.cpp&#xff0c;functions.h 首先是main.cpp内容 #include<iostream> #include"functionals.h"using namespa…

Apache与Nginx虚拟机的三种访问+非简单请求+跨域知识点整理

Apache 在D:\project\web\index.html中写入 <h1>welcome useing apache!</h1>基于ip访问 打开phpstudy_pro\Extensions\Apache2.4.39\conf\extra\httpd-vhosts.conf写入 <VirtualHost 192.168.1.4:80>ServerAdmin 88888888163.com #管理员邮箱DocumentRoo…

【BP靶场portswigger-服务端7】访问控制漏洞和权限提升-11个实验(全)

前言&#xff1a; 介绍&#xff1a; 博主&#xff1a;网络安全领域狂热爱好者&#xff08;承诺在CSDN永久无偿分享文章&#xff09;。 殊荣&#xff1a;CSDN网络安全领域优质创作者&#xff0c;2022年双十一业务安全保卫战-某厂第一名&#xff0c;某厂特邀数字业务安全研究员&…

【手写 Vue2.x 源码】第十五篇 - 生成 ast 语法树 - 构造树形结构

一&#xff0c;前言 上篇&#xff0c;主要介绍了生成 ast 语法树 - 模板解析部分 使用正则对 html 模板进行解析和处理&#xff0c;匹配到模板中的标签和属性 本篇&#xff0c;生成 ast 语法树 - 构造树形结构 二&#xff0c;构建树形结构 1&#xff0c;需要描述什么 前面…

文本相似度

传统方法 基于TF-IDF、BM25、Jaccord、SimHash、LDA等算法抽取两个文本的词汇、主题等层面的特征&#xff0c;然后使用机器学习模型&#xff08;LR, xgboost&#xff09;训练分类模型优点&#xff1a;可解释性较好缺点&#xff1a;依赖人工寻找特征&#xff0c;泛化能力一般&a…

linux有用技巧:使用ntfs-3g挂载ntfs设备

1.几种文件系统的比较 (1)在linux系统中支持以下文件系统&#xff1a; Ext2 第二扩展文件系统&#xff08;简称 ext2&#xff09;很多年前就已经成为 GNU/Linux 默认的文件系统了。ext2 取代了扩展文件系统(这是 “第二代” 的前身)。它纠正了它前身的一些错误并突破了…

【工具篇】41 # 常用可视化工具集整理(完结)

说明 【跟月影学可视化】学习笔记。 可视化场景主体需求 主体需求示例绘制基本图形根据数据绘制一些二维、三维的几何图形&#xff0c;它们不一定是完整的图表&#xff0c;通常是具有灵活性和视觉冲击力的小图形&#xff0c;例如粒子效果绘制基础图表通常是指绘制常见的饼图…

让开发人员偷懒的正则表达式

正则表达式是一种基于特殊模式符号系统的文本处理系统。简而言之&#xff0c;它为程序员提供了轻松处理和验证字符串的能力。它代表了DRY&#xff08;Dont Repeat Yourself&#xff09;原则的实现&#xff0c;在几乎所有支持的语言中&#xff0c;正则表达式模式根本不会改变形式…

【信管7.2】质量保证与质量控制

质量保证与质量控制项目质量管理的两个核心过程就是实施质量保证和控制质量。关于它们两个的区别我们在上一课已经讲了&#xff0c;实施质量保证其实保证的是过程&#xff0c;就是我们的开发过程是不是遵循了质量计划&#xff0c;也就是说&#xff0c;这是保证过程有质量的一个…

视频录制软件有哪些?4款录制视频软件,免费下载

对于不了解录屏的用户&#xff0c;肯定会有这些视频是如何制作出来的疑惑&#xff1f;其实录制视频一件很容易的事情&#xff0c;只需要找到一个可以在录视频的软件就可以了。哪有什么录制视频软件可以录制的呢&#xff1f;下面小编给大家分享4款就可以录制视频的软件&#xff…

ORB-SLAM3算法和代码学习—跟踪恒速运动模型TrackWithMotionModel()

0总述 跟踪运动模型核心思想&#xff1a;假设在极短时间内&#xff0c;相机的运动相同。设相邻时刻的三帧图像分别为k-2帧&#xff0c;k-1帧&#xff0c;k帧&#xff0c;则认为k-2帧到k-1帧相机的运动T_delta1和k-1帧到k帧相机的运动T_delta2相等&#xff0c;如下图所示。当相…

K8S概述及用途

K8S概述 1.K8S说明 K8S(Kubernetes) 是一个可移植的、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态系统。Kubernetes 的服务、支持和工具广泛可用。 Kubernetes 这个名字源…

海量数据存储面临的问题

海量数据存储面临的问题海量数据存储面临的问题成本高性能低可扩展性差如何实现分布式文件存储如何支撑高效率的计算分析如何解决海量数据存储的问题如何解决海量数据文件查询便捷问题如何解决大文件传输效率慢的问题如何解决硬件故障数据丢失问题如何解决用户查询视角统一规整…

pyhon把程序打包为whl

首先需要一个库&#xff1a;setuptools如果是conda环境的话&#xff0c;这个包是自带的&#xff0c;不需要另外安装。首先把需要打包的py文件放在一个文件夹内&#xff08;我的文件夹名为coordTrans&#xff0c;记住这个名字&#xff0c;后面要用&#xff09;。同时&#xff0c…

dll修复工具下载,dll修复工具注意事项

Dll文件的缺失相信很多人都遇见过吧&#xff0c;只要缺失了一个这样的dll文件&#xff0c;我们的游戏或者软件程序就启动不了了&#xff0c;所以我们就需要去修复它&#xff0c;目前修复有几种方法&#xff0c;最简单的&#xff0c;最适合电脑小白的&#xff0c;那就是dll修复工…