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

在这里插入图片描述

👦个人主页:@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.hqwc.cn/news/480079.html

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

相关文章

数据结构:跳表讲解

跳表 1.什么是跳表-skiplist1.1简介1.2设计思路 2.跳表的效率分析3.跳表实现3.1类成员设计3.2查找3.3插入3.4删除3.5完整代码 4.skiplist跟平衡搜索树和哈希表的对比 1.什么是跳表-skiplist 1.1简介 skiplist本质上也是一种查找结构,用于解决算法中的查找问题&…

UI设计20问(01):如何规避公说公有理婆说婆有理。

hello,我是大千UI工场,这次又开辟了一个新专题,回答UI设计中经常碰到问题,本期先回答UI设计评判标准的问题,欢迎关注评论点赞转发。 一、什么是公说公有理婆说婆有理 "公说公有理,婆说婆有理"是…

C++中自定义类型使用标准输入cin输出cout

自定义类型的输出 引言示例一运行结果示例二运行结果注意点 引言 当自己定义的数据为一些复杂数据&#xff0c;不再为基本数据类型&#xff0c;这时候要使用cout输出这些数据&#xff0c;就需要重载输出运算符<<,这样就可以使用cout来输出自定义的数据&#xff0c;相同如…

Python——元组

一、元组特性介绍 元组和列表⼀样&#xff0c;也是⼀种序列类型的数据。 唯⼀的不同是&#xff0c;元组是相对不可变的。 二、⾼效创建元组 In [1]: t1 () # 创建 空 元素的元组In [2]: type(t1) Out[2]: tuple有元素的元组实际上是使⽤英⽂的逗号创建的 In [3]:…

Vue3自定义全局指令批量注册

指令封装代码&#xff1a; import type { App } from "vue";const content {mounted(el : any, binding : any) {console.dir(binding.value);el.remove();} };const operate {mounted(el : any, binding : any) {console.dir(binding.value);el.remove();} };cons…

认识TypeScript 中的接口和类

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 接口 类 江城开朗的豌豆 在 TypeScript 中&…

Linux下多核CPU指定程序运行的核

设置程序在指定CPU核心运行 一、如何查看程序运行的CPU信息 1.1 查看当前系统CPU有几个核心 查看CPU核心数量&#xff1a;lscpu 1.2 查看程序的PID ps aux|grep cpu_test1.3 查看程序可运行的CPU taskset -c -p pid1.4 设置程序在指定核心上运行 1.4.1 通过运行时的参数设…

课后延时服务选课报名管理系统功能清单

课后延时服务选课报名管理系统分为学校端&#xff0c;培训机构端&#xff0c;家长端。 学校端提供学生管理&#xff0c;课程管理&#xff0c;班级管理&#xff0c;班级排课&#xff0c;班级课表&#xff0c;可直接安排学生入班上课&#xff0c;查看学生考勤情况&#xff0c;查…

Microsoft Visio 摄像机图标

Microsoft Visio 摄像机图标 1. 更多形状 -> 搜索形状2. 摄像机References 1. 更多形状 -> 搜索形状 2. 摄像机 ​​​ References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

[Bug解决] Invalid bound statement (not found)出现原因和解决方法

1、问题描述 在写了一个很普通的查询语句之后&#xff0c;出现了下面的报错信息 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.xxx.oauth.mapper.WxVisitorQrBeanMapper.selectByComIdAndEmpId at org.apache.ibatis.binding.Mappe…

市场复盘总结 20240220

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率中 19% 最常用…

vue3+ant design 4.x版本遇见message不显示问题。

自己打断点到success&#xff0c;但是就是没有全局显示。 第一看自己的全局引入是否有问题&#xff1a; import { createApp } from vue; import ./style.css; import App from ./App.vue; import Antd from ant-design-vue; import ant-design-vue/dist/reset.css; import ro…