【C++初阶】deque容器的介绍以及为什么stack和queue选择deque的作为底层容器适配器

news2025/1/22 17:49:13

在这里插入图片描述

👦个人主页:@Weraphael
✍🏻作者简介:目前学习C++和算法
✈️专栏:C++航路
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注✨


目录

  • 一、deque的介绍
  • 二、deque的底层原理
  • 三、 deque的缺陷
  • 四、 为什么选择deque作为stack和queue的底层默认容器

一、deque的介绍

在这里插入图片描述

双端队列deque:是一种可以在 头尾两端进行插入和删除的容器,并且底层是支持下标随机访问(queue不支持随机访问)。这样看来,它似乎是vectorlist的合体版:

  1. 支持随机访问:与vector一样,deque支持随机访问,但是效率并不高。

  2. 支持快速插入和删除:与list一样,deque支持在头部和尾部进行高效的插入和删除操作。这使得deque适用于需要频繁插入和删除元素的场景。

【接口展示】

点击跳转

在这里插入图片描述

deque即有vector的优点,也有list的优点,那么为什么还要学vectorlist呢?

因此,我们要了解deque的底层。

二、deque的底层原理

在这里插入图片描述

  • 但如果深挖底层的话,deque并不是真正连续的空间。其底层是使用一个中控数组(指针数组)来动态开辟一个个连续的空间(数组),每个块内部是一个固定大小的数组,每个数组被称为一个缓冲区。

  • 这种分段存储结构使得deque在需要扩容时比vector更高效,因为只需要分配一个新的缓冲区,而不需要复制整个容器。并且若中控数组满了,扩容代价非常低,因为只需要拷贝指针。

  • 当需要在deque的头部或尾部插入元素时,插入操作会直接在相应的头部或尾部缓冲区进行,而不需要向vector那样进行元素的搬移。

三、 deque的缺陷

  • 随机访问不够极致。因为它需要遍历搜索数据在哪个中控数组指向的数组,以及数组中的第几个元素。因此deque不适合遍历

  • 中间插入和删除操作相当复杂。若是直接在中间插入就要挪动当前空间的数据,牵扯其他缓冲区的重新分配和数据的移动,影响性能。

  • deque的应用并不多,而目前能看到的一个应用就是:用其作为stackqueue的底层默认容器

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

在这里插入图片描述
在这里插入图片描述

通过以上deque的缺点和优点,stackqueue选择deque的作为底层容器适配器就很明显了。

  1. stackqueue不需要遍历(不支持随机访问[]),只需要在固定的一端或者两端进行操作。
  2. stackqueue在尾插时,dequevector的效率高,原因是:vector扩容时,会找一块比原始空间更大的空间,然后再把数据拷贝到新空间;deque扩容时不需要搬移大量数据,只需要在中控数组添加一个指针即可。
  3. stackqueue不需要中间插入或者删除数据。

因此stackqueue选择deque完美的避开了deque缺陷。

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

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

相关文章

【C语言】实现栈

目录 (一)栈 (二)头文件 (三)功能实现 (1)初始化栈 (2) 栈的销毁 (3)压栈 (4) 出栈 (5&a…

软件实例分享,乒乓球俱乐部会员系统管理软件教程

软件实例分享,乒乓球俱乐部会员系统管理软件教程 一、前言 以下软件程序教程以 佳易王乒乓球馆计时计费软件V17.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 多种计费方式,可以按单价,也可以按时间段 可…

VR直播:只需五步,即可实现直播“黑科技”

现如今,VR直播的应用范围较为广泛,有很多人可能在现场见过VR直播的拍摄设备,不仅有高性能的电脑、VR相机,还有专业的灯光和拍摄机器等。只需要五步,就可以实现安全、高效的VR全景直播。 首先是专业全景采集设备进行全景…

用纯HTML写一个凭证并打印

最近有个需求&#xff0c;需要通过网页把单子打印出来&#xff0c;就用html实现了一个&#xff0c;主要使用了windwos自带的print打印&#xff0c;全部代码如下&#xff1a; <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" cont…

Java21 + SpringBoot3使用Spring Security时如何在子线程中获取到认证信息

文章目录 前言原因分析解决方案方案1&#xff1a;手动设置线程中的认证信息方案2&#xff1a;使用DelegatingSecurityContextRunnable创建线程方案3&#xff1a;修改Spring Security安全策略通过设置JVM参数修改安全策略通过SecurityContextHolder修改安全策略 总结 前言 近日…

Mysql开启bin-log日志

目录 一、安装配置 二、mysqlbinlog命令 一、安装配置 yum -y install mariadb mariadb-server#安装mysql数据库#默认配置文件/etc/my.cnfvim /etc/my.cnflog-binmariadb-bin #开启二进制日志 systemctl restart mariadb#会在/car/lib/mysql/产生二进制日志文件&#xff0…

Java_方法(重载方法签名等详解)

在之前我们学习C语言时&#xff0c;当我们想要重复使用某段代码的功能时&#xff0c;我们会将这段代码定义为一个函数&#xff0c;而在java中我们把这段重复使用的代码叫做方法。 方法的定义 类体的内容分为变量的声明和方法的定义&#xff0c;方法的定义包括两部分&#xff1…

全网最详细的从0到1的turbo pnpm monorepo的前端工程化项目[搭建篇]

全网最详细的从0到1的turbo pnpm monorepo的前端工程化项目[搭建篇] 引言相关环境技术栈初始化工程安装turbo配置pnpm-workspace安装husky安装lint-staged安装eslint安装prettier配置 .editorconfig配置 .gitignore初步项目结构结语 引言 最近各种原因&#xff0c;生活上的&am…

【C++初阶】值得一刷的字符串string相关oj题

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

二.重新回炉Spring Framework:Spring Framework主要组件概览

1.写在前面的话 这里主要简单说一下Spring Framework的几个核心组件的总体情况。为了比较直观&#xff0c;这里使用了ClassPathXmlApplicationContext的类图来进行说明。它基本上包含了 IoC 体系中大部分的核心类和接口。类图如下图所示&#xff1a; 2.Resource 组件体系 R…

项目管理软件品牌榜:行业领导者与热门选择

大数据、人工智能等新兴技术的崛起&#xff0c;各种行业在数字化转型的过程中&#xff0c;越来越注重有效的项目管理和协作方式。而各种项目管理软件应运而生&#xff0c;以帮助企业提高效率、降低成本、提高协作性。然而在众多的项目管理软件市场上&#xff0c;如何选择适合自…

PCIe TX端电容

一、问题&#xff1a;PCIe为什么要加电容 PCIe为什么要加电容&#xff1f;具体的作用是什么&#xff1f; 答&#xff1a;因为PCIe Host和Receiver两端的直流偏置会不一样&#xff0c;所以需要在PCIe的传输路径上加电容&#xff0c;这样传输路径上只有AC信号&#xff0c;不存在…

小白如何学鸿蒙开发?

在互联网技术不断发展的现在&#xff0c;鸿蒙操作系统的出现标志着是能技术领域的一次重大突破&#xff0c;鸿蒙作为华为推出的一代操作系统&#xff0c;鸿蒙不仅达代表了自主创新的力量&#xff0c;还因为独特的分布式架构和全场景适配能力而备受关注。随着鸿蒙生态的不断完善…

机器学习 | 实现图像加密解密与数字水印处理

目录 实现窗口可视化 数字图像加密 窗口布局设置 基于混沌Logistic的图像加密 基于三重DES的图像加密 数字图像解密 窗口布局设置 基于混沌Logistic的图像解密 基于三重DES的图像解密 基于LSB的数字水印提取 窗口布局设置 水印的嵌入与提取 实现窗口可视化 这里…

【C++】类与对象【定义、访问限定符、this指针】

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;http://t.csdnimg.cn/eCa5z 目录 面向过程和面向对象初步认识 类的引入 类的定义 成员变量命名规则的建议&#xff1a; 类的访问限定符及…

代码随想录刷题笔记 DAY 29 | 非递减子序列 No.491 | 全排列 No.46 | 全排列 II No. 47

文章目录 Day 2901. 非递减子序列&#xff08;No. 491&#xff09;1.1 题目1.2 笔记1.3 代码 02. 全排列&#xff08;No. 46&#xff09;2.1 题目2.2 笔记2.3 代码 03. 全排列 II&#xff08;No. 47&#xff09;3.1 题目3.2 笔记3.3 代码 Day 29 01. 非递减子序列&#xff08;…

Spring Boot打war包部署到Tomcat,访问页面404 !!!

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 文章目录 Spring Boot打war包部署到Tomcat&#xff0c;访问页面404 &#xff01;&#xff01;&#xff01;解决办法&#xff1a;检查Tomcat版本和Jdk的对应关系&#xff0c;我的Tomcat是6.x&#x…

C语言系列-预定义符号#define定义宏#define定义宏

&#x1f308;个人主页: 会编辑的果子君 &#x1f4ab;个人格言:“成为自己未来的主人~” 目录 预定义符号 #define定义常量 #define定义宏 预定义符号 C语言设置了一些预定义符号&#xff0c;可以直接使用&#xff0c;预定义符号也是在预处理期间处理的。 __FILE__ /…

渗透测试练习题解析 4(CTF web)

1、[GXYCTF2019]禁止套娃 1 考点&#xff1a;git 泄露 进入靶场后只有一串文字&#xff0c;源代码、抓包之类的都没有敏感信息出现&#xff0c;直接用 kali 的 dirsearch 扫描 发现存在 .git 目录&#xff0c;猜测应该是源码泄露&#xff0c;使用 GitHack 扒一下源码&#xff0…

第13章 网络 Page747~749 asio核心类 ip::tcp::resolver

3&#xff0c; ip::tcp::resolver 如果新浪的IP地址变了&#xff0c;该怎么办呢? ip::tcp::resolver 可以帮我们用上www.sina.com.cn&#xff0c;因为它负责将人类可读的多种网址信息&#xff0c;一步 到位地解析成ip::tcp::socket建立连接所需要的ip::tcp::endpoint结构&…