c++ 中的容器 vector、deque 和 list 的区别

  1. 表格汇总
容器存储结构随机访问性能中间插入/删除性能两端插入/删除性能内存管理特点迭代器类型适用场景
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)元素节点单独分配,可能碎片化双向迭代器频繁中间插入/删除,不依赖随机访问
  1. 存储结构
    • vector
      • 是一个动态数组,元素在内存中是连续存储的。这使得它可以像数组一样支持快速的随机访问,通过下标访问元素的时间复杂度为 O ( 1 ) O(1) O(1)。例如,对于一个 std::vector<int> v;,使用 v[2] 可以快速访问第三个元素(索引从 0 开始)。
    • deque(双端队列)
      • 数据在内存中是分段连续存储的,对用户而言逻辑上是连续的。它也支持随机访问,不过效率比 vector 稍低,但仍为 O ( 1 ) O(1) O(1)。例如,对于 std::deque<int> d;,可以使用 d[3] 来访问第四个元素。
    • list(双向链表)
      • 是一个双向链表,每个元素存储在一个节点中,节点包含数据和指向前一个及后一个节点的指针。这导致它不能直接根据下标进行随机访问,访问元素需要从头部或尾部开始遍历,时间复杂度为 O ( n ) O(n) O(n),其中 n 是元素的个数。
  2. 插入和删除元素的性能
    • vector
      • 在末尾插入和删除元素通常比较快,时间复杂度为 O ( 1 ) O(1) O(1),但当元素数量达到容器的容量时,插入元素会触发扩容操作,需要重新分配内存和复制元素,性能开销较大。在中间插入或删除元素时,需要移动其后的元素,时间复杂度为 O ( n ) O(n) O(n)。例如,v.insert(v.begin() + 2, 5); 会将元素 5 插入到 v 的第三个位置,其后的元素会向后移动。
    • deque
      • 在两端插入和删除元素都非常快,时间复杂度为 O ( 1 ) O(1) O(1)。在中间插入或删除元素时,性能比 vector 好,因为不需要移动大量元素,但仍然比 list 慢,时间复杂度为 O ( n ) O(n) O(n)。例如,d.push_front(1);d.push_back(2); 分别在 deque 的前端和后端插入元素。
    • list
      • 在任何位置插入和删除元素都很快,只要有指向该位置的迭代器,时间复杂度为 O ( 1 ) O(1) O(1),因为只需要修改前后节点的指针,不涉及元素的移动。例如,对于 std::list<int> l;,使用 l.insert(l.begin(), 3); 插入元素 3 时,只需调整指针。
  3. 内存管理
    • vector
      • 当空间不足时,会分配一个更大的连续内存空间,将原元素复制过去,释放原空间。这可能导致性能开销和内存浪费(预留但未使用的空间)。例如,当 v 的元素数量超过其容量时,会重新分配更大的内存空间。
    • deque
      • 以块为单位分配内存,当需要更多空间时,会分配新的块,不需要像 vector 那样大规模复制元素,因此在空间扩展时相对更稳定。
    • list
      • 每个元素节点单独分配内存,插入元素时为新节点分配内存,不会出现 vector 那样的整体复制和重新分配问题,但可能导致内存碎片化,因为节点是分散存储的。
  4. 迭代器特性
    • vector
      • 迭代器是随机访问迭代器,可以进行加、减操作,支持 operator[]。在插入或删除元素时,可能导致迭代器失效,特别是在扩容时,迭代器和指针、引用都可能失效。
    • deque
      • 迭代器是随机访问迭代器,但在中间插入或删除元素时,部分迭代器可能失效,因为存储是分段的。
    • list
      • 迭代器是双向迭代器,只能进行前后移动,不支持 operator[]。在插入或删除元素时,只有被操作元素的迭代器失效,其他迭代器不受影响。
  5. 适用场景
    • vector
      • 适合需要频繁随机访问元素,并且元素的插入和删除操作主要在末尾进行的场景。例如,存储一组学生成绩,经常根据索引查询成绩,成绩的添加和删除多在末尾。
    • deque
      • 适用于需要在两端高效插入和删除元素,同时也需要一定程度随机访问能力的情况。例如,实现一个双端操作的队列,或者一个窗口滑动的数据结构。
    • list
      • 适用于需要频繁在容器中间插入和删除元素,对随机访问性能要求不高的情况。例如,实现一个文本编辑器中的文本行存储,频繁插入和删除行操作。

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

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

相关文章

ASP.NET Core - 日志记录系统(二)

ASP.NET Core - 日志记录系统&#xff08;二&#xff09; 2.4 日志提供程序2.4.1 内置日志提供程序2.4.2 源码解析 本篇接着上一篇 ASP.NET Core - 日志记录系统(一) 往下讲&#xff0c;所以目录不是从 1 开始的。 2.4 日志提供程序 2.4.1 内置日志提供程序 ASP.NET Core 包括…

nginx的可视化配置工具nginxWebUI的使用

文章目录 1、nginx简介2、nginxWebUI2.1、技术解读2.2、开源版和专业版之间的区别2.3、功能解读 3、安装与使用3.1、下载镜像3.2、查看镜像3.3、启动容器3.4、使用 4、总结 1、nginx简介 Nginx 是一个高效的 HTTP 服务器和反向代理&#xff0c;它擅长处理静态资源、负载均衡和…

【C++】IO 流

文章目录 &#x1f449;C 语言的输入与输出&#x1f448;&#x1f449;流是什么&#x1f448;&#x1f449;C IO 流&#x1f448;C 标准 IO 流C 和 C 语言的输入格式问题C 的多次输入内置类型和自定义类型的转换日期的多次输入C 文件 IO 流文本文件和二进制文件的读写 &#x1…

基于springboot的幼儿园管理系统系统

作者&#xff1a;学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等 文末获取“源码数据库万字文档PPT”&#xff0c;支持远程部署调试、运行安装。 项目包含&#xff1a; 完整源码数据库功能演示视频万字文档PPT 项目编码&#xff1…

Pycharm 使用教程

一、基本配置 1. 切换Python解释器 pycharm切换解释器版本 2. pycharm虚拟环境配置 虚拟环境的目的&#xff1a;创建适用于该项目的环境&#xff0c;与系统环境隔离&#xff0c;防止污染系统环境&#xff08;包括需要的库&#xff09;虚拟环境配置存放在项目根目录下的 ven…

Java设计模式——单例模式(特性、各种实现、懒汉式、饿汉式、内部类实现、枚举方式、双重校验+锁)

文章目录 单例模式1️⃣特性&#x1f4aa;单例模式的类型与实现&#xff1a;类型懒汉式实现(线程不安全)懒汉式实现(线程安全&#xff09;双重锁校验懒汉式(线程安全)饿汉式实现(线程安全)使用类的内部类实现⭐枚举方式实现单例&#xff08;推荐&#xff09;&#x1f44d; 单例…

STM32 FreeRTOS中断管理

目录 FreeRTOS的中断管理 1、STM32中断优先级管理 2、FreeRTOS任务优先级管理 3、寄存器和内存映射寄存器 4、BASEPRI寄存器 5、FreeRTOS与STM32中断管理结合使用 vPortRaiseBASEPRI vPortSetBASEPRI 6、FromISR后缀 7、在中断服务函数中调用FreeRTOS的API函数需注意 F…

[Spring] SpringCloud概述与环境工程搭建

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

mobaxterm内置编辑器中文出现乱码如何解决:直接更换编辑器为本地编辑器

诸神缄默不语-个人CSDN博文目录 使用场景是我需要用mobaxterm通过SSH的方式登录服务器&#xff0c;进入服务器之后我就直接打开代码文件&#xff0c;mobaxterm会直接用内置的编辑器&#xff08;MobaTextEditor&#xff09;打开&#xff0c;但这会导致中文编程乱码。 我一开始是…

机器学习与人工智能的关系

机器学习与人工智能的关系 一、人工智能二、机器学习2.1 机器学习与人工智能的关系2.2 机器学习的本质 三、其他玩艺 曾几何时&#xff0c;人工智能还是个科幻名词&#xff0c;仿佛只属于未来世界。如今&#xff0c;它已经渗透到了我们生活的方方面面&#xff0c;成为顶流。我们…

一些常见的Java面试题及其答案

Java基础 1. Java中的基本数据类型有哪些&#xff1f; 答案&#xff1a;Java中的基本数据类型包括整数类型&#xff08;byte、short、int、long&#xff09;、浮点类型&#xff08;float、double&#xff09;、字符类型&#xff08;char&#xff09;和布尔类型&#xff08;boo…

构建高性能网络服务:从 Socket 原理到 Netty 应用实践

1. 引言 在 Java 网络编程中&#xff0c;Socket 是实现网络通信的基础&#xff08;可以查看我的上一篇博客&#xff09;。它封装了 TCP/IP 协议栈&#xff0c;提供了底层通信的核心能力。而 Netty 是在 Socket 和 NIO 的基础上&#xff0c;进一步封装的高性能、异步事件驱动的…

Docker PG流复制搭建实操

目录标题 制作镜像1. 删除旧的容器2. 创建并配置容器3. 初始化数据库并启动 主库配置参数4. 配置主库5. 修改 postgresql.conf 配置 备库配置参数6. 创建并配置备库容器7. 初始化备库 流复制8. 检查主库复制状态9. 检查备库配置 优化建议问题1&#xff1a;FATAL: using recover…

Elasticsearch 批量导入数据(_bluk方法)

官方API&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html 建议先看API POST /<索引名>/_bulk 格式要求&#xff1a; POST _bulk { "index" : { "_index" : "test", "_id" : &q…

Active Prompting with Chain-of-Thought for Large Language Models

题目 大型语言模型的思维链主动提示 论文地址&#xff1a;https://arxiv.org/abs/2302.12246 项目地址&#xff1a;https://github.com/shizhediao/active-prompt 摘要 大型语言模型(LLM)规模的不断扩大为各种需要推理的复杂任务带来了涌现能力&#xff0c;例如算术和常识推理…

Windows图形界面(GUI)-QT-C/C++ - QT控件创建管理初始化

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 控件创建 包含对应控件类型头文件 实例化控件类对象 控件设置 设置父控件 设置窗口标题 设置控件大小 设置控件坐标 设置文本颜色和背景颜色 控件排版 垂直布局 QVBoxLayout …

04、Redis深入数据结构

一、简单动态字符串SDS 无论是Redis中的key还是value&#xff0c;其基础数据类型都是字符串。如&#xff0c;Hash型value的field与value的类型&#xff0c;List型&#xff0c;Set型&#xff0c;ZSet型value的元素的类型等都是字符串。redis没有使用传统C中的字符串而是自定义了…

traceroute原理探究

文章中有截图&#xff0c;看不清的话&#xff0c;可以把浏览器显示比例放大到200%后观看。 linux下traceroute的原理 本文通过抓包观察一下linux下traceroute的原理 环境&#xff1a;一台嵌入式linux设备&#xff0c;内网ip是192.168.186.195&#xff0c;其上有192.168.202.…

无源器件-电容

电容器件的参数 基本概念由中学大学物理或电路分析内容获得&#xff0c;此处不做过多分析。 电容的产量占全球电子元器件产品的40%以上。 单位&#xff1a;法拉 F&#xff1b;1F10^6uF&#xff1b;电路中常见的104电容就是10*10^4pF100nF0.1uF C为电容&#xff0c;Rp为绝缘电…

自动连接校园网wifi脚本实践(自动网页认证)

目录 起因执行步骤分析校园网登录逻辑如何判断当前是否处于未登录状态&#xff1f; 书写代码打包设置开机自动启动 起因 我们一般通过远程控制的方式访问实验室电脑&#xff0c;但是最近实验室老是断电&#xff0c;但重启后也不会自动连接校园网账户认证&#xff0c;远程工具&…