C++之deque

一、vector与list的优缺点

  • vector的优点:下标的随机访问,尾插,尾删效率高。CPU高速缓存命中率高
  • vector的缺点:扩容(效率,空间浪费),不适合头插头删。

连续的物理空间为他带来了优点也带来了缺点,可谓成也萧何败也萧何

  • list的优点: 按需申请和释放空间,任意位置O(1)的插入删除
  • list的缺点:不支持下标的随机访问       

那有没有一种容器既有vector的优点又有list的优点呢,于是deque被大佬们研究出来 。

deque 叫做双端队列,但是它不是队列。它设计的初衷是融合vector和list的优点,组成一个全新的容器,大有替代vector和list的趋势。

二、deque的简单介绍

1.deque的接口

不能看出,从它的接口角度就可以看出它想要替代掉vector和list。但是它失败了,因为它四不像,vector和list在它俩的优点方面做到了极致。deque是啥都会一点,但是不精通。

但是deque 也不是完全没用,栈和队列用它刚刚好。或者有时候你既要头插头删,尾插尾删,又随机访问的时候用它也挺好。

2.deque的原理介绍

deque( 双端队列 ) :是一种双开口的 " 连续 " 空间的数据结构 ,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1) ,与 vector 比较,头插效率高,不需要搬移元素;与 list 比较,空间利用率比较高。

deque 并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际 deque 类似于一个动态的二维 数组 ,其底层结构如下图所示:

deque这一段段连续的空间就叫做buffer,假设一个buffer里放8个数据就满了,满了以后我就扩容,我再去找一个buffer,物理上虽然不是连续的,但逻辑上他俩是连续的。头插的话,我还是再开上一个buffer,这样就解决了vector的头插和尾插,及空间连续的问题。

然后还设计了一个中控指针数组进行管理这些buffer,比如我开第一个buffer的时候,把这个buffer的指针存在中间位置,头插就在前面位置存一个buffer的地址,尾插就在它后面存一个buffer的地址

如何支持随机访问呢?

假设每个buffer里是8个数据,进行deque[i]操作的时候,首先看i是不是小于第一个buffer的值,如果大于就进行/看是在第几个buffer里,然后%8看是在buffer里的第几个值,进行判断越界。所以这个随机也不是很随,因为他要进行很多的运算。所以如果要频繁的调用[]就不太好了,但是比起list有比较好。

而且deque在中间位置进行插入和删除也很麻烦,且栈和队列也不需要在中间位置进行插入与删除

deque 是如何借助其迭代器维护其假想连续的结构呢?

中控的指针数组的迭代器里有四个指针,两个指针指向指针的开始和结束一个指针指向当前访问的位置,迭代器++就是cur++,当cur等于last的时候就结束,解引用迭代器就是取cur这个位置。当cur等于last结束时跳转下一个buffer的时候,就通过这个node指针,node存储的是指针数组的地址,对node++就找到下一个位置了,也就是下一个buffer。

3.deque的缺陷

vector 比较 deque 的优势是:头部插入和删除时, 不需要搬移元素,效率特别高 ,而且在 扩容时,也不 需要搬移大量的元素 ,因此其效率是必 vector 高的。
list 比较 ,其底层是连续空间, 空间利用率比较高 ,不需要存储额外字段。
但是, deque 有一个致命缺陷:不适合遍历,因为在遍历时, deque 的迭代器要频繁的去检测其是否移动到 某段小空间的边界,导致效率低下 ,而序列式场景中,可能需要经常遍历,因此 在实际中,需要线性结构 时,大多数情况下优先考虑 vector list deque 的应用并不多,而 目前能看到的一个应用就是, STL 用其作 stack queue 的底层数据结构

4. 为什么选择deque作为stackqueue的底层默认容器

stack 是一种后进先出的特殊线性数据结构,因此只要具有 push_back() pop_back() 操作的线性结构,都可以作为stack 的底层容器,比如 vector list 都可以; queue 是先进先出的特殊线性数据结构,只要具有push_back和 pop_front 操作的线性结构,都可以作为 queue 的底层容器,比如 list 。但是 STL 中对 stack 和queue默认选择 deque 作为其底层容器,主要是因为:
1. stack queue 不需要遍历 ( 因此 stack queue 没有迭代器 ) ,只需要在固定的一端或者两端进行操作。
2. stack 中元素增长时, deque vector 的效率高 ( 扩容时不需要搬移大量数据,浪费空间也不多 ) ;stack中的元素增长时,deque相比list,cpu高速cache命中。其次不会频繁申请小空间。申请和释放空间次数少,代价低。在queue的元素增长时,同样相比list,cpu高速cache命中。其次不会频繁申请小空间。申请和释放空间次数少,代价低。
所以deque作为stack和queue的默认容器是完胜的。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring事务失效场景

【事务的回滚仅仅对于unchecked的异常有效。对于checked异常无效。也就是说事务回滚仅仅发生在,出现RuntimeException或Error的时候。通俗一点就是:代码中出现的空指针等异常,会被回滚。而文件读写、网络超时问题等,spring就没法回…

2024-2-22 作业

作业要求: 复习前面知识点(指针、结构体、函数)整理思维导图顺序表(按位置插入、按位置删除和去重、重新写)理解链表的代码,尝试写一下链表的尾插和输出 1.复习前面知识点(指针、结构体、函数) 2.整理思维导图 3.顺序表(按位置插入、按位置删除和去重、…

172基于matlab的MPPT智能算法

基于matlab的MPPT智能算法,通过细菌觅食进行优化。算法引入了趋向性操作,用以进行局部范围内的最优寻找;引入了复制操作,用以避免种群更新盲目随机性,加快了算法的收敛速度;引入了迁徙操作用以避免算法陷入…

Linux进一步研究权限-----------ACL使用

一、使用情况 1.1、场景: 某个大公司,在一个部门,有一个经理和手下有两个员工,在操控一个Linux项目,项目又分为三期做,然而一期比较重要,经理带着员工做完了,公司就觉得技术难点已经做完攻克了&#xff0…

视频评论抓取软件|抖音数据抓取工具

最近我们推出了一款基于C#语言开发的工具。这款工具提供了丰富的功能,旨在帮助用户轻松获取抖音视频内容。让我们一起来详细介绍一下这款工具的主要功能模块: 1. 批量视频提取: 工具提供了便捷的批量视频提取功能,用户只需输入关…

Vue学习之计算属性

模板中的表达式虽然方便,但也只能用来做简单的操作。如果在模板中写太多逻辑,会让模板变得臃肿,难以维护。比如说,我们有这样一个包含嵌套数组的对象: const author reactive({name: John Doe,books: [Vue 2 - Advan…

Windows环境下使用SSH的开源图形化SFTP工具客户端 简介和基本使用

在Windows环境下,有许多开源的图形化SFTP工具客户端可以使用,其中比较受欢迎的是WinSCP和FileZilla。下面我将分别介绍这两个工具的基本信息和使用方法。 WinSCP WinSCP是一个Windows环境下使用的开源图形化SFTP客户端,它也支…

06 Qt自绘组件:Switch动画开关组件

系列文章目录 01 Qt自定义风格控件的基本原则-CSDN博客 02 从QLabel聊起:自定义控件扩展-图片控件-CSDN博客 03 从QLabel聊起:自定义控件扩展-文本控件-CSDN博客 04 自定义Button组件:令人抓狂的QToolButton文本图标居中问题-CSDN博客 0…

第一个 Angular 项目 - 添加服务

第一个 Angular 项目 - 添加服务 这里主要用到的内容就是 [Angular 基础] - service 服务 提到的 前置项目在 第一个 Angular 项目 - 动态页面 这里查看 想要实现的功能是简化 shopping-list 和 recipe 之间的跨组件交流 回顾一下项目的结构: ❯ tree src/app/…

Linux---权限管理(ACL权限、特殊位和隐藏属性)

目录 1.ACT权限 1.1什么是ACT权限 1.2ACT图解 2.操作步骤 2.1添加测试目录、用户、组,并将用户添加到组 2.2修改目录的所有者和所属组 2.3设定权限 2.4为临时用户分配权限 2.4.1添加临时用户 2.4.2为临时用户分配特定权限 2.4.3查看目录权限,注…

【C语言】详解计算机二级c语言程序题

文章目录 前言资料相关程序题 一(字符串)程序题 二(数组)程序题 三(基础)程序题 四(结构体)程序题 五(结构体)程序题 六(基础) 前言 …

无人机精准定位技术,GPS差分技术基础,RTK原理技术详解

差分GPS的基本原理 差分GPS(Differential GPS,简称DGPS)的基本原理是利用一个或多个已知精确坐标的基准站,与用户(移动站)同时接收相同的GPS卫星信号。由于GPS定位时会受到诸如卫星星历误差、卫星钟差、大…

springboot+vue项目部署配置开机自启动

1.前端部属 下载nginx解压,在nginx\conf下找到nginx.conf 添加如下代码 server {listen 8081;server_name localhost;charset utf-8;location / {root F:/1ceshi/dist; #前端打包路径try_files $uri $uri/ /index.html;index index.html index.htm;}l…

123 Linux C++ 系统编程2 Linux 上安装卸载程序三种方法,linux 下解压缩命令 tar介绍。kill命令,top命令,umask 命令

一 通过命令和网络直接安装 sudo apt-get update sudo apt-get update 的工作就是将自己本地 ubutun的软件列表和 aliyun 的软件列表对比,如不一样,则更新。 sudo apt-get install 软件名 真正的安装 那么这里就有一个问题了, 怎么从aliy…

操作系统(1)——学习导论(Ⅰ)

目录 小程一言专栏链接: [link](http://t.csdnimg.cn/6grrU) 学习导论什么是操作系统主要功能强调 操作系统历史硬件层面处理器重要特点and功能 存储器磁盘I/O设备小程常用的I/O设备及其特点 小程一言 本操作系统专栏,是小程在学操作系统的过程中的第一步&#xff…

STL初始---C++

STL目录 1.STL的产生原因2.STL基本概念与六大组件2.1基本概念2.2六大组件 3.STL中容器、算法、迭代器3.1容器3.2算法3.3迭代器 4.STL简单应用4.1vector存放内置数据类型4.2vector存放自定义数据类型4.3vector容器嵌套容器 1.STL的产生原因 长久以来,软件界一直希望…

使用代理IP技术实现爬虫同步获取和保存

概述 在网络爬虫中,使用代理IP技术可以有效地提高爬取数据的效率和稳定性。本文将介绍如何在爬虫中同步获取和保存数据,并结合代理IP技术,以提高爬取效率。 正文 代理IP技术是一种常用的网络爬虫技术,通过代理服务器转发请求&a…

MDS300-16-ASEMI电源控制柜MDS300-16

编辑:ll MDS300-16-ASEMI电源控制柜MDS300-16 型号:MDS300-16 品牌:ASEMI 封装:M25 最大重复峰值反向电压:1600V 最大正向平均整流电流(Vdss):300A 功率(Pd):大功率 芯片个数&#xff1…

记录 使用FFMPEG 笔记本摄像头推流

一、使用 FFMPEG 测试摄像头拉流显示 # 获取摄像头名称 ffmpeg -list_devices true -f dshow -i dummy# 我笔记本上的摄像头名称如下 device_pnp_\\?\usb#vid_0408&pid_1020&mi_00#6&199e90f7&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global# 使…

基于JAVA的房屋出售出租系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 房屋销售模块2.2 房屋出租模块2.3 预定意向模块2.4 交易订单模块 三、系统展示四、核心代码4.1 查询房屋求租单4.2 查询卖家的房屋求购单4.3 出租意向预定4.4 出租单支付4.5 查询买家房屋销售交易单 五、免责说明 一、摘…