C++ deque的总结

2023-11-01

deque

1. deque是什么?

  1. deque(发音类似“deck”),是双端队列不规则的首字母缩写,双端队列是动态大小的序列式容器,其可以像两端进行伸缩。
  2. 特定的库可以以不同的方式实现deque,但通常都是一种动态数组。不论在何种情况下,它都允许通过随机访问迭代器直接访问单个元素,可以根据需要动态的伸缩。
  3. 因此,deque提供了一些与vector相似的功能,但deque在头部和尾部进行数据插入和删除操作更加高效。与vector不同的是,deque不能保证所有的元素存储在连续的空间中,在deque中通过指针加偏移量方式访问元素可能会导致非法的操作。
  4. vector与list提供了相似的接口,因此其具有类似的用途,但是内部的实现原理不同:vector使用使用了动态数组,该数组通常需要动态增长;deque中的元素可能分散在不同的存储块中,在deque中保存了
    一些必要的信息,通常用来在常数范围内直接访问deque中的任何一个元素,所以deque的内部实现比vector复杂,但是这些额外信息使得deque在某些情况下增长更加的高效,特别是在序列比较大,重新分
    配成本比较高的情况下。
  5. 除了在频繁在头部或尾部进行插入和删除操作外,deque比list和forward_list的性能更差。

deque的详情解释

2. 既然deque与vector相似,那为什么还要有这个容器呢?

vector、list和deque对比:

vector:

优点:可以随机访问。

缺点:在头插和头删的时候效率不高,并且当预设的空间用完时需要增容。

list:

优点:插入删除效率高。

缺点:不能随机访问,还会造成内存碎片

所以deque就是vector和list比较折中的方法。

deque:物理不连续,逻辑连续的vector。

优点:随机访问、插入删除效率高、无较大增容代价。

实现方法:中控+缓冲的方式。

中控:指针数组。

双端队列(deque)的底层是一段假象的连续空间,实际是分段连续的,为了维护其“整体连续”的假象,落在了deque的迭代器身上。

本篇博客的图片均来自《STL源码剖析》

在这里插入图片描述

我们可以从这张图中看到deque的结构,它是由一个中控(map)来控制一段一段缓冲区(buffer)。这些buffer并不是连续的,而是当目前我们要进行插入时,存储空间不够时再开辟一段buffer。这样就改进了vector扩容的问题。(vector扩容时,会开辟当前所有数据+需要插入的数据的空间再进行拷贝,效率非常低)

3. 那么我们到底怎么知道当前该在哪里插入删除呢?

这些工作是由deque的迭代器来完成的。

下面对迭代器需求描述来自《STL源码剖析》

让我们思考一下,deque迭代器应该具备什么结构。首先,它必须能够指出分段连续空间(亦缓冲区)在哪里,其次它必须能够判断自己是否已经处于其所在缓冲区的边缘,如果是,一旦前进或后退时就必须跳跃至下一个或上一个 缓冲区。为了能够正确跳跃,deque必须随时掌握管控中心(map)

在这里插入图片描述

这是一个迭代器能达到的基本需求:cur表示当前可以插入的位置,first表示当前缓冲区的第一个结点的位置,last表示最后一个结点的位置,node表示该缓冲区在map中的位置。

比如我们现在定义一个deque对象,并且令每个缓冲区可以存8个元素。然后存20个元素进去。

在这里插入图片描述

第一个缓冲区因为存满了所以它指向第一个元素,最后一个缓冲区因为还有空间所以cur指向最后一个元素的下一个元素。

4. deque接口

在这里插入图片描述

5.deque的应用场景

deque在序列式容器中比较鸡肋,因为如果只是简单的存储元素,使用vector即可,如果对元素任意位置进行插入或者删除操作比较多,使用vector即可,所以一般很少去使用deque。deque最大的应用,就是用其
作为标准库中stack和queue的底层结构。

还记得C语言里面队列和栈是怎么实现的吗?就是用了数组或链表但是我们在接口里面手动把他插入和删除的方式更改了规则。这里deque也是一样,它作为了C语言里面数组或链表的作用,作为deque的底层容器,然后再根据需要改变了插入和删除的规则而已。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ deque的总结 的相关文章

  • Docker 容器重命名

    命令 docker rename oldName newName 例子
  • 云计算基础——云存储技术简介

    云存储的种类及其合适的应用 可以把云存储分成块存储与文件存储两类 块存储 快速更改的单一文件系统 针对单一文件大量写的高性能计算 HPC 文件存储 文件及内容搜寻 Tier 2 NAS 多文件大量写入的应用 数据大量读写的应用 多个使用端都
  • GA遗传优化算法(附MATLAB源码)

    优化算法之遗传算法GA 遗传算法 Genetic Algorithm GA 最早是由美国的 John holland提出 主要模拟生物进化论的自然选择和遗传学机理生成计算模型 是一种通过模拟自然进化过程搜索最优解的方法 将问题的求解过程转换
  • 帆软图表下钻后,设置为数据分析模式

    在图表的特效 gt 网络报表中 添加一个op参数 值设置为 公式 view 因为参数会在URL后添加 op view

随机推荐

  • Javaweb开发基本项目结构

    学校里老师都没讲这个 所以浅讲一下 web项目尽量要照这种格式 方便扩展和阅读 比方说这个项目 api层 controller servlet logic层 接口层 此层可以说是最外层 也是与前端直接接触的层 它会直接使用其他层的代码处理数
  • 【Java】算术工具类,精确数学计算

    由于代码较长 可以通过 ctrl F 搜索需要的方法 package com ectit utils import java math BigDecimal author daishixing titile ArithmeticUtils
  • 项目/商务、客户与需求[ZHUAN]

    你得完全了解你所在公司的软硬件实力 明白有那些弱点和特 长 在谈判的时候你得敏锐的分析出客户的想法有那些可能会很难搞又没有多大意义 你得引导客户往本公司擅长的技术上去思考 你得引导客户 而不是只听客户 怎么说你就怎么做
  • How to Relate an SLA Directly to a Case in CRM 2016

    SLAs Service Level Agreements were introduced in Microsoft Dynamics 2013 SP1 6 1 This robust feature lets you manage res
  • Nginx学习研究-Nginx配置详解

    一 Nginx简介 Nginx 是一款轻量级的 Web 服务器 反向代理服务器 及电子邮件 IMAP POP3 代理服务器 它主要有三个作用 分别是Web服务器 反向代理 配置SSL证书 http转发到https 和负载均衡 二 Nginx
  • Qt6 添加 QOpenGLWidget 报错

    添加 QOpenGLWidget 控件后编译报错 undefined reference to imp ZN13QOpenGLWidgetC1EP7QWidget6QFlagsIN2Qt10WindowTypeEE collect2 exe
  • Qt绘图控件QCustomPlot: (一)安装及使用

    一 目录 一 介绍 二 下载及配置环境 三 建立工程 四 基础画图 一 介绍 QCustomPlot是一个Qt c 小控件 用于绘图和数据可视化 它没有其它的依赖关系 并且有很好的帮助文档 这个绘图库专注于制作好看的 高质量的2D绘图 图形
  • vue(五)组件、自定义属性props

    一 组件化开发 组件化开发指的是 根据封装的思想 把页面上可重用的 UI 结构封装为组件 从而方便项目 的开发和维护 vue 是一个支持组件化开发的前端框架 vue 中规定 组件的后缀名是 vue App vue 文件 本质上就是一个 vu
  • 竞速榜实时离线对数方案演进介绍

    一 背景 竞速榜是大促期间各采销群提供的基于京东实时销售数据的排行榜 同样应对大促流量洪峰场景 通过榜单撬动品牌在京东增加资源投入 竞速榜基于用户配置规则进行实时数据计算 榜单排名在大促期间实时变化 相关排名数据在微博 朋友圈广泛传播 相关
  • android 日历开发附源码(附源码)

    这里主要记录一下在编写日历apk过程中一些主要的点 先看下效果图 一 主要功能 1 支持农历 节气 常用节假日 2 使用数据库 设置计划 二 基本结构 我们要实现的日历控件采用GestureDetector构造器 使用OnGestureLi
  • 《ImageNet Classification with Deep Convolutional Neural Networks》——AlexNet论文整理

    题目 ImageNet Classification with Deep Convolutional Neural Networks 简介 AlexNet属于一个更大更深的LeNet 改进有以下三点 增加了dropout层 丢弃层 激活函数
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • 硬盘再生器和mhdd相比_让小白变高手,硬盘维修的三大工具简单、实用

    在我们平时使用电脑中经常会遇到 系统突然奔溃 然而自己确实是什么都没干系统就坏了这让很多人摸不着头脑到底是自己弄得还是系统哪里坏了 其实不然像这种情况大多数情况下都是硬盘不稳定而导致的系统文件丢失而不能启动系统 最多情况的就是注册表丢失 开
  • 启动hbase出现Java HotSpot(TM) 64-Bit Server VM warning

    分布式hbase启动异常提醒 分布式hbase启动过程出现Java HotSpot TM 64 Bit Server VM warning提醒异常 主要是因为使用的JAVA JDK版本问题 JDK8 以上的版本不需要如下图所示的红框内的两行
  • 讲述deployment、service、ingress资源的lables关系

    在实验之前 我们都知道 lable是k8s中内部找寻各个资源的依据 比如deployment需要跟那个pod资源进行绑定 通过lable service资源如何跟pod资源进行绑定 通过lable service资源如何跟service资源
  • Fabric区块大小的实验

    首先记录已在账本的大小 见下图 大小是319784字节 修改peer的源代码 将区块写入文件时 输出新区块的大小 编译peer并替代原来的peer 重新启动节点 在终端上记录区块高度 调用智能合约的链码函数 产生一个新区块 账本大小变为32
  • Java中堆和栈创建对象的区别

    栈与堆都是Java用来在Ram中存放数据的地方 与C 不同 Java自动管理栈和堆 程序员不能直接地设置栈或堆 Java的堆是一个运行时数据区 类的对象从中分配空间 这些对象通过new newarray anewarray和multiane
  • AI2019下载Adobe Illustrator CC2019安装教程

    Illustrator 简称 AI 是一款非常强大的矢量图制图软件 在平面设计 UI设计 广告设计等诸多行业都有广泛的应用 并且作为必备软件有它的不可替代性 但很多朋友在开始安装AI软件的时候却遇到种种困难 为此 我亲自录制了安装教程 也分
  • ios开发问题记录记录

    1 提示 usr include c v1 threading support 457 11 error build Use of undeclared identifier nanosleep 原因 header search paths
  • C++ deque的总结

    deque 1 deque是什么 deque 发音类似 deck 是双端队列不规则的首字母缩写 双端队列是动态大小的序列式容器 其可以像两端进行伸缩 特定的库可以以不同的方式实现deque 但通常都是一种动态数组 不论在何种情况下 它都允许