[C++] vector对比list deque的引出

Kevin的技术博客.png

文章目录

  • `list`与`vector`的对比
  • 双端队列`deque`
    • `deque`的特性
    • `deque`的底层实现原理
      • 内存结构
        • 块表(Block Array)
        • 块(Block)
      • 插入与删除
        • 两端插入
        • 两端删除
      • 随机访问
        • 如何计算位置
      • 迭代器设计
  • 总结


listvector的对比

vectorlist都是STL中非常重要的序列式容器,由于两个容器的底层结构不同,导致其特性以及 应用场景不同,其主要不同如下:

特性**vector**(动态数组)**list**(双向链表)
底层结构动态顺序表,一段连续空间带头结点的双向循环链表
随机访问支持随机访问,访问效率O(1)不支持随机访问,访问某个元素效率O(N)
插入和删除任意位置插入和删除效率低,需要搬移元素,时间复杂度为O(N),插入时有可能需要增容,增容:开辟新空间,拷贝元素,释放旧空间,导致效率更低任意位置插入和删除效率高,不需要搬移元素,时间复杂度为O(1)
空间利用率底层为连续空间,不容易造成内存碎片,空间利用率高,缓存利用率高
(但是扩容会二倍扩,可能造成空间浪费)底层节点动态开辟,小节点容易造成内存碎片,空间利用率低,缓存利用率低
(在申请空间的时候是按需申请,不会浪费空间)
迭代器封装原生态指针对原生态指针(节点指针)进行封装
迭代器失效在插入元素时,要给所有的迭代器重新赋值,因为插入元素有可能会导致重新扩容,致使原来迭代器失效,删除时,当前迭代器需要重新赋值否则会失效插入元素不会导致迭代器失效,删除元素时,只会导致当前迭代器失效,其他迭代器不受影响
使用场景需要高效存储,支持随机访问,不关心插入删除效率大量插入和删除操作,不关心随机访问

[C++] vector入门&迭代器失效问题详解-CSDN博客
[C++] 深入浅出list容器-CSDN博客
以上是对listvector的相关讲解。在关于list的文章中有对list容器关于将原生指针包装为迭代器的详细讲解,以及关于listvector中关于迭代器失效等问题的详细解答。

双端队列deque

deque的特性

deque(双端队列)结合了vectorlist的优缺点,提供了在两端进行高效插入和删除的能力,同时支持高效的随机访问。deque的底层实现比vectorlist更复杂,它使用了一系列的小的连续数组块来管理数据,这样可以在两端插入和删除时避免频繁的内存分配和拷贝。
基于deque的如上特性,经常用来作为queue的实现所基于的容器。queue 可以基于任何类型的容器来实现,而 deque 提供了高效的队列操作所需的基本功能:从前端插入和删除元素,以及从后端插入元素。

deque 提供了以下特性,使其适合作为 queue 的底层实现:

  • 从两端快速插入和删除元素的能力。
  • 动态大小调整,不需要像 vector 那样进行整体的内存重新分配。

1627372174-103268.png

deque的底层实现原理

deque(双端队列)的底层实现可以理解为一个动态的分段数组。它结合了数组和链表的优点,通过一组固定大小的小数组(称为缓冲区)来管理数据。

内存结构

deque并不是像vector那样的一块连续内存,而是由多个固定大小的块组成。每个块是一个连续的小数组,这些块按顺序排列,形成一个类似环形的结构。每个块的大小是固定的,但deque可以动态增加或减少块的数量。
czGx1.png
deque起初是在多个的中间位置开始建立,如此可以更高效的向前或者向后延伸。

块表(Block Array)

deque内部维护了一个指向这些块的指针数组,这个数组被称为块表(block array)。块表记录了所有块的指针,通过块表可以定位到具体的块,从而找到存储的数据。

块(Block)

每个块内部是一个固定大小的数组。每个块的大小通常是一个固定的常量,这样可以在块表中通过偏移量计算快速定位到块中的元素。

插入与删除

deque支持在两端高效的插入和删除,这主要得益于其分段结构。

两端插入
  • 前端插入:在前端插入元素时,若当前前端块有空间,则直接插入;否则,在块表的前端插入一个新的块,然后将数据插入新块中。
  • 后端插入:后端插入的处理方式与前端类似。如果后端块已满,则在块表后端新增一个块。
两端删除
  • 前端删除:从前端块删除元素,如果前端块为空,则释放该块并调整块表。
  • 后端删除:与前端删除类似,删除后如果后端块为空,则释放该块。

随机访问

deque支持高效的随机访问,这是因为它可以通过块表和块内偏移快速定位元素。

如何计算位置

对于一个给定的索引,首先需要计算它所在的块,然后计算块内的偏移量。具体计算公式如下:

  1. 计算块索引:block_index = (start + index) / block_size
  2. 计算块内偏移:offset = (start + index) % block_size

迭代器设计

deque的迭代器较为复杂,因为它需要封装块表、块和块内元素的位置信息。deque的迭代器通常包含以下信息:

  1. 当前块指针:指向当前元素所在的块。
  2. 块内指针:指向当前块中的具体位置。
  3. 块表指针:指向块表中的位置。

通过这些信息,迭代器可以支持前向、后向的遍历和随机访问。当进行迭代操作时,迭代器需要处理跨块的情况,这增加了迭代器的复杂性。
IgAwE.png

总结

  • deque的底层是一个分段的、动态的二维数组结构,它提供了高效的两端插入删除操作(中间删除操作效率和**vector**一样,需要移动数据 O(N)),同时保留了随机访问的能力(下标随机访问略逊与vector)。
  • 这种分段结构使得deque在需要频繁修改两端的数据的场景下,具有比vector更高的性能和灵活性。
  • 迭代器的设计相对复杂,需要维护跨块的信息,但也因此提供了强大的功能。


image.png

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

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

相关文章

【python】PyQt5中QRadioButton的详细用法教程与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

[windows] 关于多线程中使用SendMessage

https://developer.aliyun.com/article/228325

@antv/x6 利用工具,在节点的左上角,或者节点的右上角,增加一个X的红色删除小按钮。

1、上个图: 官方地址:https://x6.antv.antgroup.com/tutorial/intermediate/tools 2、鼠标移上去,左上角会有一个删除小按钮,这个是x6自动的功能,只要稍微写二行代码就实现了: graph.on(node:mouseenter,…

leetcode 矩阵专题——java实现

73. 矩阵置零 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]] 关键在于:一次扫描全表…

【云服务器】vscode + onethingAi + SSH远程连接

通过VS code远程连接服务器,并进行上传和下载文件操作_vs code 上传制定文件-CSDN博客 vscode远程连接服务器(remote ssh)上传本地文件到服务器(sftp)_vscode上传文件到服务器-CSDN博客 vscode连接远程服务器(傻瓜式教学&#x…

苹果电脑怎么录制屏幕?3招教你轻松录制,高效实用

随着数字化时代的快速发展,屏幕录制已经成为我们日常工作和生活中不可或缺的一部分。它不仅是展示产品、教授知识、分享经验的重要工具,更是我们展现个性和创造力的新舞台。在苹果电脑上,屏幕录制功能的应用更是将这一体验推向了新的高度。 …

【屏驱MCU】RT-Thread 文件系统接口解析

本文主要介绍【屏驱MCU】基于RT-Thread 系统的文件系统原理介绍与代码接口梳理 目录 0. 个人简介 && 授权须知1. 文件系统架构1.1 虚拟文件系统目录架构 2. menuconfig 分析3. 代码接口分析3.1 DFS框架挂载目录3.2 【FAL抽象层】分区表和设备表3.3 如何将【文件路径】挂…

多任务协程处理的流程,看看是否和你想像的一样

import time import asyncioasync def func1():print("你好,我是第一个任务")await asyncio.sleep(3)print("你好,我是第二个任务")async def func2():print("你好,我是第3个任务")await asyncio.sleep(2)…

GNSS形变监测系统

TH-WY1 GNSS形变监测系统采用扼流圈设计有以下几个优势: 高精度测量:扼流圈是一种高精度的传感器,可以提供非常精确的测量结果。这使得GNSS形变监测系统能够准确地测量结构物的形变变化。 高稳定性:扼流圈设计使得传感器具有良好…

第33篇 计算数据中最长的连续1的个数<三>

Q:如何将计算出的结果(最长的连续1的个数)显示在DE2-115开发板的HEX上? A:基本原理:DE2-115_Computer_System中的HEX并行端口作为内存映射设备连接到DE2-115开发板的七段数码管,每个端口都对应…

大模型提示工程(Prompt),让LLM自己优化提示词

前言 随着大家对于prompt提问的研究以及对于高质量回答的追求,现在有一个比较热的词叫做prompt creator。 Prompt Creator 实际上是使得 ChatGPT 更好的引导你去完善自己的提问,同时也完善自己的回答,更好地指导自己回答出更加令使用者满意…

win10桌面任务栏美化(不用软件)(任务栏应用居中,透明任务栏)

透明任务栏 1、打开设置——个性化——颜色,打开透明效果; 2、在搜索框搜索注册表编辑器; 3、找如下路径:计算机\HKEY-CURRENT-USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced; 4、寻找文件&a…

【TS】TypeScript类型断言:掌握类型转换的艺术

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 TypeScript类型断言:掌握类型转换的艺术1. 引言2. 什么是类型断言&a…

链表的实现(C++版)

对于链表的学习,之前在C语言部分的时候就已经有学习过,也学会了使用C语言来打造一个链表.如今学了C 则想通过C来打造一个链表,以达到锻炼自己的目的. 1.链表的初步实现 1.节点模板的设置 template <class T> struct ListNode{ListNode <T>* _next;ListNode <T…

k8s学习--使用kubepshere部署devops项目时遇到的报错(无法找到gitee仓库)

今天在kubesphere部署devops项目&#xff0c;编辑流水线的时候&#xff0c;发现怎么也访问不到gitee仓库 报错的流水线位置 报错日志 报错原因 变量问题 因为看见了csy/sangomall&#xff0c;所以理所当然的把路径变量GITEE_ACCOUNT写成了用户名 解决方法 结果发现仓库…

可靠的图纸加密软件,七款图纸加密软件推荐

大家好啊,我是小固,今天跟大家聊聊图纸加密软件。 作为一名设计师,我深知保护自己的知识产权有多重要。曾经就因为图纸泄露,差点血本无归,那个教训可真是惨痛啊!所以我今天就给大家推荐几款靠谱的图纸加密软件,希望能帮到你们。 固信软件https://www.gooxion.com/ 首先要隆重…

Java语言程序设计——篇十一(1)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 欢迎大家&#xff1a;这里是CSDN&#xff0c;我的学习笔记、总结知识的地方&#xff0c;喜欢的话请三连&#xff0c;有问题可以私信&#x1f33…

Vue 的安装与配置

今天是八月一日&#xff0c;我也开启了Vue的学习&#xff0c;希望和大家一起学编程&#xff0c;相互督促&#xff0c;相互进步&#xff01; 安装vscode 安装Node.js 官网&#xff1a;https://nodejs.org/zh-cn 下载完正常安装就行 可以winr输入cmd&#xff0c;也可以vscod…

springboot智能健康管理平台-计算机毕业设计源码57256

摘要 在当今社会&#xff0c;人们越来越重视健康饮食和健康管理。借助SpringBoot框架和MySQL数据库的支持&#xff0c;开发智能健康管理平台成为可能。该平台结合了小程序技术的便利性和SpringBoot框架的快速开发能力&#xff0c;为用户提供了便捷的健康管理解决方案。 通过智能…