【C++】STL标准库之deque

news2024/11/17 23:31:34

STL标准库之deque

  • 双端队列deque的介绍
  • 双端队列的底层结构
  • 双端队列的迭代器
  • 双端队列的缺陷
  • 为何将双端队列作为栈和队列的底层默认容器

双端队列deque的介绍

双端队列和我们常见的队列或者优先级队列不同,双端队列是一种双开口的连续空间的数据结构。双开口意味着它可以从两端进行插入和删除,同时还能够保证具有O(1)的时间复杂度。比vector的头插效率高,不需要搬移元素,比list空间利用率高,开辟的是一段段连续空间。

双端队列以其独有的空间特点,使得具备有上述优势
在这里插入图片描述
那么就有一个问题,它是如何做到双端进出还能达到O(1)的时间复杂度呢?

实际上,双端队列的底层并不是上图中所画的样子,它是由一段段连续的小空间拼接而成,类似于一个动态的二维数组。

双端队列的底层结构

在这里插入图片描述

实际上,双端队列的底层和二维数组有点相似,当开辟一小段空间后,进行头插和尾插,当头插时发现头部位置的空间已满,则会在当前空间之前再开辟一段空间,在新开辟空间的最后进行插入,如果尾插时发现尾部空间已满,则在当前位置的下面再开辟一段空间,在新空间的头部进行插入。新开辟的空间都有各自的入口地址,map就是在记录当前每一小段空间的入口地址。记录的方式是从中心向外记录,也就是先放入到map中最中心的位置,如果开辟的空间在前面就放到中心位置的前面,在后面就放到中心位置的后面。

而如果当前map已经满了,意味着需要进行扩容了,这时候的扩容就无需将所有的元素都重新拷贝一遍,而是直接创建一个新的map,将旧map中的值拷贝到新map,在将旧map释放即可。

可能有人会问这样的拷贝代价大吗?
其实可以说很小,因为map中的元素个数实际上就是小段空间的个数,小段空间的个数本身不会非常大。

这样就解释了为何双端队列能够实现头插尾插头删尾删的时间复杂度都是O(1),并且还能保证是连续空间。由于连续空间,使得缓存利用率也较高,而比list的空间利用率也要高(连续空间,无需使用指针记录下一个节点的位置)

双端队列的迭代器

由于双端队列特殊的结构,我们对其迭代器进行设计时也显得较为复杂。由于需要记录当前位置是否在当前空间头部,以及是否在当前空间的尾部,还需要记录当前位置在整个map中的位置。
在这里插入图片描述

可以看到,双端队列的迭代器是由四个指针组成的,其中有指向当前位置的指针,指向当前空间中头部位置的指针,指向尾部元素的指针,指向map中当前空间node节点的元素。由这四个指针共同维护着当前空间中某一个元素的位置,以防止其越界。

双端队列的缺陷

与vector比较,deque的优势是:头部插入和删除时,不需要搬移元素,效率特别高,而且在扩容时,也不需要搬移大量的元素,因此其效率是必vector高的。
与list比较,其底层是连续空间,空间利用率比较高,不需要存储额外字段。

但是,deque有一个致命缺陷:不适合遍历,因为在遍历时,deque的迭代器要频繁的去检测其是否移动到某段小空间的边界,导致效率低下,而序列式场景中,可能需要经常遍历,因此在实际中,需要线性结构时,大多数情况下优先考虑vector和list,deque的应用并不多,而目前能看到的一个应用就是,STL用其作为stack和queue的底层数据结构。

为何将双端队列作为栈和队列的底层默认容器

1.stack和queue不需要遍历,只需要在一端或者两端进行操作。
2.在stack中元素增长时,deque比vector的效率高(扩容时不需要搬移大量数据);queue中的元素增长时,deque不仅效率高,而且内存使用率高。

因此,使用deque可以完美的利用其有点,而避免其缺陷。

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

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

相关文章

盘点好用的3D渲染软件,哪个更适合你?

3D 渲染软件可以帮助建筑师和设计专业人士通过逼真的图像或视频将他们的 3D 模型变为现实,相信许多刚刚接触渲染行业的小伙伴都会有一个疑问,那就是五花八门的各色渲染软件,我究竟用哪个比较好?其实,选择3D渲染器主要还…

每日一题——反转字符串中的单词

每日一题 反转字符串中的单词 题目链接 思路(进阶) 我们首先不考虑太多限制因素,先看如何实现字符串中单词的反转 举个例子:我们要反转字符串“the sky is blue”中的单词,我们可以先将字符串中的每个字符反转“eht …

APP渗透—微信小程序、解包反编译、数据抓包

APP渗透—微信小程序、解包反编译、数据抓包 1. 前言2. 小程序抓包2.1. 安卓系统5.0版本测试2.1.1. 添加模拟器2.1.2. 安装证书2.1.2.1. 确保在同一局域网2.1.2.2. 设置burp工具2.1.2.3. 设置模拟器代理2.1.2.4. 下载证书2.1.2.5. 修改证书2.1.2.6. 安装证书 2.1.3. 抓包测试 2…

基于海鸥算法改进的随机森林回归算法 - 附代码

基于海鸥算法改进的随机森林回归算法 - 附代码 文章目录 基于海鸥算法改进的随机森林回归算法 - 附代码1.数据集2.RF模型3.基于海鸥算法优化的RF4.测试结果5.Matlab代码6.Python代码 摘要:为了提高随机森林数据的回归预测准确率,对随机森林中的树木个数和…

【机器学习】决策树如何实现回归

【机器学习】决策树如何实现回归 文章目录 【机器学习】决策树如何实现回归1. 介绍2. 回归树的构建方法3. 递归二分法4. 回归树的剪枝5. 总结参考 1. 介绍 在 https://blog.csdn.net/qq_51392112/article/details 中,我们详细介绍了决策树基本内容:如何…

Visual Studio搭建Linux环境

环境:ubantu22.04.2 Visual Studio2019 可以先参考这个文章 微软官网 1.在配置之前需要搭建好远程Linux系统的环境需要安装penssh-server、gdb、gdbserver: sudo apt-get install openssh-server sudo apt-get install gdb gdbserver2.然后启动ssh服务 …

Filename: “/usr/local/flexlm/licenses/license.dat“

故障现象1:学习安装vcs时,出现如下打印: 8:30:51 (lmgrd) Servers System Date and Time: Fri May 05 2023 08:30:51 EDT 8:30:51 (lmgrd) SLOG: Summary LOG statistics is enabled. 8:30:51 (lmgrd) license manager: cant initialize:Ca…

K8S管理系统项目实战[API开发]

前端: Vueelement plus 后端: gogin 后端 Go 快速入门 Gin Web框架 K8s管理系统项目实战[API开发] 项目背景,整体设计,Client-go,框架搭建 一、项目背景 随着容器技术的广泛应用,kubernetes逐渐成为业内的核心技术&#xf…

【SpringBoot】SpringBoot集成ElasticSearch

文章目录 第一步,导入jar包,注意这里的jar包版本可能和你导入的不一致,所以需要修改第二步,编写配置类第三步,填写yml第四步,编写util类第五步,编写controller类第六步,测试即可 第一…

黎曼几何与黎曼流形

目录 0.黎曼几何 1. 欧几里得几何与黎曼几何的区别 2.黎曼流形 3.黎曼距离 4.切空间 5.黎曼均值 6. SPD矩阵如何形成黎曼流型 7.切线空间映射 8.同余变换和同余不变 9.黎曼对齐 科普性笔记,做了解,不深入。 0.黎曼几何 黎曼几何是一种基于欧几…

MySQL 表操作

目录 创建表 案例 查看表结构 修改表 案例: 删除表 创建表 CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎 ; 说明: field 表示列名 dat…

【Vue学习笔记3】使用Vite开启一个Vue3工程项目

1. 什么是Vite? Vite是一个web开发构建工具。Vite 的竞品是 Webpack,而且按照现在的趋势看,使用率超过 Webpack 也是早晚的事。 Vite 主要提升的是开发的体验,Webpack启动调试环境需要 3 分钟都很常见,Vite大大缩短了这个时间。…

应急加固初试(windows sever 2008)

前言 红中(hong_zh0) CSDN内容合伙人、2023年新星计划web安全方向导师、 华为MindSpore截至目前最年轻的优秀开发者、IK&N战队队长、 吉林师范大学网安大一的一名普通学生、搞网安论文拿了回大挑校二、 阿里云专家博主、华为网络安全云享专家、腾讯云自媒体分享计划博主 …

SEO优化新手必须掌握的10个技巧和工具

随着互联网的不断发展,SEO(搜索引擎优化)已成为网站拓展和推广的重要手段之一。对于新手而言,学习SEO的基础知识和技巧是至关重要的。在本文中,我将分享SEO优化新手必须掌握的10个技巧和工具。 1.关键词研究 关键词是…

Spring Cloud学习笔记【分布式配置中心-Config】

文章目录 SpringCloud Config概述概述传统方式弊端主要功能与GitHub整合配置 Config服务端配置与测试服务端配置(即Gitee上的配置文件)Config Demo配置Spring Cloud Config访问规则 Config客户端配置与测试bootstrap.yml说明Config客户端 Demo配置 SpringCloud Config概述 概述…

学校信息化管理系统通常包含哪些功能?

学校管理信息化是现代教育发展的必然趋势,随着信息技术的飞速发展,学校管理也逐渐地实现了信息化。信息化的学校管理已经成为教育现代化建设的重要内容,也是提高学校教育教学质量和保障学生安全的重要手段。 作为一款低代码开发平台&#xf…

【Shell编程】| if 判断的五个关键点

个人主页:董哥聊技术 我是董哥,嵌入式领域新星创作者 创作理念:专注分享高质量嵌入式文章,让大家读有所得! 文章目录 1、if语法格式1.1 if格式1.2 else if 和 else 2、算数比较3、文件判断4、字符串判断5、test指令测试…

Unity Audio -- (1)概览

准备工作 资源包: https://connect-prd-cdn.unity.com/20230208/8dab3a98-4fe1-4adf-99df-8f6c9e1058c9/creativecore-audio-2021.3LTS.zip 下载,解压后用Unity Hub导入本地工程,具体方法,参考: Project setup proce…

放弃40k月薪的程序员工作,选择公务员,我来分享一下看法

我有一个朋友,拒绝了我为他提供的4万薪水的工作,去了一个体制内的银行,做程序员,即使薪水减半。他之前在北京一家大公司做程序员,一个月30k。当我开始创业时,我拉他来和我一起干,但那时我们太小…

干货 | 思维转变之如何成为一个快速学习者!!!

Hello,大家好! 这里是壹脑云科研圈,我是喵君姐姐~ 在信息爆炸的今天,网络上有各种资源,其实有心想要学习,都可以学到。 但是,其实自我学习的过程还是比较艰难,那么是否…