c++ 中的容器 vector、deque 和 list 的区别
- 表格汇总:
| 容器 | 存储结构 | 随机访问性能 | 中间插入/删除性能 | 两端插入/删除性能 | 内存管理特点 | 迭代器类型 | 适用场景 |
|---|---|---|---|---|---|---|---|
vector | 连续存储的动态数组 | O ( 1 ) O(1) O(1) | O ( n ) O(n) O(n)(需要移动元素) | 末尾: O ( 1 ) O(1) O(1),头部: O ( n ) O(n) O(n) | 空间不足时重新分配并复制元素 | 随机访问迭代器 | 频繁随机访问,插入/删除在末尾 |
deque | 分段连续存储 | O ( 1 ) O(1) O(1)(稍逊于 vector) | O ( n ) O(n) O(n)(优于 vector) | O ( 1 ) O(1) O(1) | 以块为单位分配内存,空间扩展更稳定 | 随机访问迭代器 | 两端高效插入/删除,需一定随机访问 |
list | 双向链表,节点存储元素及前后指针 | O ( n ) O(n) O(n)(需遍历) | O ( 1 ) O(1) O(1)(仅需修改指针) | O ( 1 ) O(1) O(1) | 元素节点单独分配,可能碎片化 | 双向迭代器 | 频繁中间插入/删除,不依赖随机访问 |
- 存储结构:
vector:- 是一个动态数组,元素在内存中是连续存储的。这使得它可以像数组一样支持快速的随机访问,通过下标访问元素的时间复杂度为 O ( 1 ) O(1) O(1)。例如,对于一个
std::vector<int> v;,使用v[2]可以快速访问第三个元素(索引从 0 开始)。
- 是一个动态数组,元素在内存中是连续存储的。这使得它可以像数组一样支持快速的随机访问,通过下标访问元素的时间复杂度为 O ( 1 ) O(1) O(1)。例如,对于一个
deque(双端队列):- 数据在内存中是分段连续存储的,对用户而言逻辑上是连续的。它也支持随机访问,不过效率比
vector稍低,但仍为 O ( 1 ) O(1) O(1)。例如,对于std::deque<int> d;,可以使用d[3]来访问第四个元素。
- 数据在内存中是分段连续存储的,对用户而言逻辑上是连续的。它也支持随机访问,不过效率比
list(双向链表):- 是一个双向链表,每个元素存储在一个节点中,节点包含数据和指向前一个及后一个节点的指针。这导致它不能直接根据下标进行随机访问,访问元素需要从头部或尾部开始遍历,时间复杂度为 O ( n ) O(n) O(n),其中
n是元素的个数。
- 是一个双向链表,每个元素存储在一个节点中,节点包含数据和指向前一个及后一个节点的指针。这导致它不能直接根据下标进行随机访问,访问元素需要从头部或尾部开始遍历,时间复杂度为 O ( n ) O(n) O(n),其中
- 插入和删除元素的性能:
vector:- 在末尾插入和删除元素通常比较快,时间复杂度为 O ( 1 ) O(1) O(1),但当元素数量达到容器的容量时,插入元素会触发扩容操作,需要重新分配内存和复制元素,性能开销较大。在中间插入或删除元素时,需要移动其后的元素,时间复杂度为 O ( n ) O(n) O(n)。例如,
v.insert(v.begin() + 2, 5);会将元素 5 插入到v的第三个位置,其后的元素会向后移动。
- 在末尾插入和删除元素通常比较快,时间复杂度为 O ( 1 ) O(1) O(1),但当元素数量达到容器的容量时,插入元素会触发扩容操作,需要重新分配内存和复制元素,性能开销较大。在中间插入或删除元素时,需要移动其后的元素,时间复杂度为 O ( n ) O(n) O(n)。例如,
deque:- 在两端插入和删除元素都非常快,时间复杂度为 O ( 1 ) O(1) O(1)。在中间插入或删除元素时,性能比
vector好,因为不需要移动大量元素,但仍然比list慢,时间复杂度为 O ( n ) O(n) O(n)。例如,d.push_front(1);和d.push_back(2);分别在deque的前端和后端插入元素。
- 在两端插入和删除元素都非常快,时间复杂度为 O ( 1 ) O(1) O(1)。在中间插入或删除元素时,性能比
list:- 在任何位置插入和删除元素都很快,只要有指向该位置的迭代器,时间复杂度为 O ( 1 ) O(1) O(1),因为只需要修改前后节点的指针,不涉及元素的移动。例如,对于
std::list<int> l;,使用l.insert(l.begin(), 3);插入元素 3 时,只需调整指针。
- 在任何位置插入和删除元素都很快,只要有指向该位置的迭代器,时间复杂度为 O ( 1 ) O(1) O(1),因为只需要修改前后节点的指针,不涉及元素的移动。例如,对于
- 内存管理:
vector:- 当空间不足时,会分配一个更大的连续内存空间,将原元素复制过去,释放原空间。这可能导致性能开销和内存浪费(预留但未使用的空间)。例如,当
v的元素数量超过其容量时,会重新分配更大的内存空间。
- 当空间不足时,会分配一个更大的连续内存空间,将原元素复制过去,释放原空间。这可能导致性能开销和内存浪费(预留但未使用的空间)。例如,当
deque:- 以块为单位分配内存,当需要更多空间时,会分配新的块,不需要像
vector那样大规模复制元素,因此在空间扩展时相对更稳定。
- 以块为单位分配内存,当需要更多空间时,会分配新的块,不需要像
list:- 每个元素节点单独分配内存,插入元素时为新节点分配内存,不会出现
vector那样的整体复制和重新分配问题,但可能导致内存碎片化,因为节点是分散存储的。
- 每个元素节点单独分配内存,插入元素时为新节点分配内存,不会出现
- 迭代器特性:
vector:- 迭代器是随机访问迭代器,可以进行加、减操作,支持
operator[]。在插入或删除元素时,可能导致迭代器失效,特别是在扩容时,迭代器和指针、引用都可能失效。
- 迭代器是随机访问迭代器,可以进行加、减操作,支持
deque:- 迭代器是随机访问迭代器,但在中间插入或删除元素时,部分迭代器可能失效,因为存储是分段的。
list:- 迭代器是双向迭代器,只能进行前后移动,不支持
operator[]。在插入或删除元素时,只有被操作元素的迭代器失效,其他迭代器不受影响。
- 迭代器是双向迭代器,只能进行前后移动,不支持
- 适用场景:
vector:- 适合需要频繁随机访问元素,并且元素的插入和删除操作主要在末尾进行的场景。例如,存储一组学生成绩,经常根据索引查询成绩,成绩的添加和删除多在末尾。
deque:- 适用于需要在两端高效插入和删除元素,同时也需要一定程度随机访问能力的情况。例如,实现一个双端操作的队列,或者一个窗口滑动的数据结构。
list:- 适用于需要频繁在容器中间插入和删除元素,对随机访问性能要求不高的情况。例如,实现一个文本编辑器中的文本行存储,频繁插入和删除行操作。
相关文章:
c++ 中的容器 vector、deque 和 list 的区别
表格汇总: 容器存储结构随机访问性能中间插入/删除性能两端插入/删除性能内存管理特点迭代器类型适用场景vector连续存储的动态数组 O ( 1 ) O(1) O(1) O ( n ) O(n) O(n)(需要移动元素)末尾: O ( 1 ) O(1) O(1),头部…...
【物流管理系统 - IDEAJavaSwingMySQL】基于Java实现的物流管理系统导入IDEA教程
有问题请留言或私信 步骤 下载项目源码:项目源码 解压项目源码到本地 打开IDEA 左上角:文件 → 新建 → 来自现有源代码的项目 找到解压在本地的项目源代码文件,点击确定,根据图示步骤继续导入项目 查看项目目录ÿ…...
数据集-目标检测系列- 电话 测数据集 call_phone >> DataBall
数据集-目标检测系列- 电话 测数据集 call DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 需要更多数据资源和技术解决方案,知识星球: “DataBall - X 数据球(free)” 贵在坚持! …...
VUE3 自定义指令的介绍
自定义指令的概述 在 Vue 中,自定义指令是一种机制,允许开发者在模板中直接操作 DOM 元素,执行一些低级别的操作。Vue 提供了几个内置指令(如 v-if、v-for、v-model 等),但当我们需要一些特定功能时&#…...
HTML学习笔记记录---速预CSS(2) 复合属性、盒子模型、边框线、浮动、定位
复合属性写法: {font: font-style font-weitght font-size/line-height font-family} {font: 样式 粗细 字号 字体} (书写瞬间为固定的不可更改) block 块级元素 div inline 行内元素 span inline-block 行内块元素 …...
二 RK3568 固件中打开 ADB 调试
一 usb adb Android 系统,设置->开发者选项->已连接到计算机 打开,usb调试开关打开 通过 usb otg 口连接 开发上位机 (windows/linux) 上位机安装 adb 服务之后 , 通过 cmd/shell: #1 枚举设备 adb devices #2 进入 android shell adb shell # 3 验证上传下载…...
centos9设置静态ip
CentOS 9 默认使用 NetworkManager 管理网络,而nmcli是 NetworkManager 命令行接口的缩写,是一个用来进行网络配置、管理网络连接的命令工具,可以简化网络设置,尤其是在无头(没有图形界面)环境下。 1、 cd…...
【Python】Python之Selenium基础教程+实战demo:提升你的测试+测试数据构造的效率!
这里写目录标题 什么是Selenium?Selenium基础用法详解环境搭建编写第一个Selenium脚本解析脚本脚本执行结果常用的元素定位方法常用的WebDriver方法等待机制 Selenium高级技巧详解页面元素操作处理弹窗和警告框截图和日志记录多窗口和多标签页操作 一个实战的小demo…...
内网服务器添加共享文件夹功能并设置端口映射
参考网址 https://blog.csdn.net/Think88666/article/details/118438465 1.服务器安装smb服务,由于网路安全不允许使用默认端口(445,446),于是修改端口为62445、62446。 2.每台需要共享的电脑都要修改端口映射&#x…...
第三十六章 Spring之假如让你来写MVC——拦截器篇
Spring源码阅读目录 第一部分——IOC篇 第一章 Spring之最熟悉的陌生人——IOC 第二章 Spring之假如让你来写IOC容器——加载资源篇 第三章 Spring之假如让你来写IOC容器——解析配置文件篇 第四章 Spring之假如让你来写IOC容器——XML配置文件篇 第五章 Spring之假如让你来写…...
TypeScript语言的学习路线
TypeScript语言的学习路线 TypeScript(TS)是由Microsoft开发的一种开源编程语言,是JavaScript的超集,提供了严格的类型检查和基于类的面向对象编程特性。随着前端开发的不断进步,TypeScript逐渐成为了现代前端开发的主…...
Python爬虫-汽车之家各车系周销量榜数据
前言 本文是该专栏的第43篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏之前,笔者在文章《Python爬虫-汽车之家各车系月销量榜数据》中,有详细介绍,如何爬取“各车系车型的月销量榜单数据”的方法以及完整代码教学教程。 而本文,笔者同样以汽车之家平台为例,…...
C#格式化输出
上一期: C#格式化输出-CSDN博客 字符串插值 字符串插入功能,使得我们可以更直观地嵌入表达式到字符串中,只需要在字符串前加上$符号即可实现这一点。着中国方法不仅提高了代码的可读性,而且简化了字符串构造的过程。 使用Inse…...
Open FPV VTX开源之默认MAVLink设置
Open FPV VTX开源之默认MAVLink设置 1. 源由2. 准备3. 连接4. 安装5. 配置6. 测试6.1 启动wfb-ng服务6.2 启动wfb-ng监测6.3 启动QGroundControl6.4 观察测试结果 7. 总结8. 参考资料9. 补充9.1 telemetry_tx异常9.2 DEBUG串口部分乱码9.3 PixelPilot软件问题 1. 源由 飞控图传…...
【初识扫盲】逆概率加权
我们正在处理一个存在缺失数据的回归模型,并且希望采用一种非参数的逆概率加权方法来调整估计,以应对这种缺失数据的情况。 首先,我们需要明确问题的背景。我们有样本 { ( Y i , X i , r i ) : i 1 , … , n } \left\{\left(Y_i, \boldsym…...
Ubuntu中双击自动运行shell脚本
方法1: 修改文件双击反应 参考: https://blog.csdn.net/miffywm/article/details/103382405 chmod x test.sh鼠标选中待执行文件,在窗口左上角edit菜单中选择preference设计双击执行快捷键,如下图: 方法2: 设置一个应用 参考: https://blo…...
理解AJAX与Axios:异步编程的世界
理解AJAX与Axios:异步编程的世界 在现代Web开发中,异步编程作为一种处理复杂操作的方式,已经成为不可或缺的一部分。AJAX(Asynchronous JavaScript and XML)和Axios是两种实现异步请求的流行技术。本文将深入探讨这两…...
分组通道自注意力G-CSA详解及代码复现
G-CSA定义 G-CSA (Grouped Channel Self-Attention) 是一种创新性的视觉注意力机制,巧妙地结合了卷积和自注意力的优势。通过将输入特征图划分为多个独立的通道组,在每个组内执行自注意力操作,G-CSA实现了高效的全局信息交互,同时保留了局部特征细节。这种方法不仅提高了模…...
汽车基础软件AutoSAR自学攻略(四)-AutoSAR CP分层架构(3) (万字长文-配21张彩图)
汽车基础软件AutoSAR自学攻略(四)-AutoSAR CP分层架构(3) (万字长文-配21张彩图) 前面的两篇博文简述了AutoSAR CP分层架构的概念,下面我们来具体到每一层的具体内容进行讲解,每一层的每一个功能块力求用一个总览图,外加一个例子的图给大家进…...
玩转大语言模型——langchain调用ollama视觉多模态语言模型
系列文章目录 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 langchain调用ollama视觉多模态语言模型 系列文章目录前言使用Ollama下载模型查找模型下载模型 测试模型ollama测试langchain测试加载图片加载模型…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
