C++中数组、链表和vector等容器之间的区别

2023-11-01

这里写图片描述

1. 各个容器之间区别

① vector
  (连续的空间存储,可以使用[]操作符)快速的访问随机的元素,快速的在末尾插入元素,但是在序列中间岁间的插入,删除元素要慢,而且如果一开始分配的空间不够的话,有一个重新分配更大空间,然后拷贝的性能开销。

② deque
  (小片的连续,小片间用链表相连,实际上内部有一个map的指针,因为知道类型,所以还是可以使用[],只是速度没有vector快)快速的访问随机的元素,快速的在开始和末尾插入元素,随机的插入,删除元素要慢,空间的重新分配要比vector快,重新分配空间后,原有的元素不需要拷贝。对deque的排序操作,可将deque先复制到vector,排序后在复制回deque。

③ list
  (每个元素间用链表相连)访问随机元素不如vector快,随机的插入元素比vector快,对每个元素分配空间,所以不存在空间不够,重新分配的情况

④ set
  内部元素唯一,用一棵平衡树结构来存储,因此遍历的时候就排序了,查找也比较快的哦。
⑤ map
  一对一的映射的结合,key不能重复。
⑥ stack
  适配器,必须结合其他的容器使用,stl中默认的内部容器是deque。先进后出,只有一个出口,不允许遍历。
⑦ queue
  是受限制的deque,内部容器一般使用list较简单。先进先出,不允许遍历

2. vector、deque和list选择准则

  vector、deque和list都是动态增长的,选择标准主要是关注插入特性以及对元素的后续访问要求。
  1) vector: 连续的内存区域,随机访问效率高,插入删除效率低。Vector并不是随每一个元素的插入而增长自己,而是当vector需要增长自身时,它实际分配的空间比当前所需的空间要多一些,也就是说,它分配了一些额外的内存容量,或者说他预留了这些存储区(分配的额外容量的确切数目由具体实现定义)。实际上,对于小的对象,vector在实践中比list效率更高。
  vector的动态自我增长越频繁,元素插入的开销就越大。两种解决方案:
  a) 当vector开销变大时,把vector转换成list.
  b) 更常用的方案时,通过指针间接存储复杂的类对象。首先,容量从1增加到256,重新分配的次数大大减少。其次,指向类对象的指针的拷贝和释放不需要调用该类的拷贝构造函数和析构函数。
  2) list: 非连续的内存区域,并通过一对指向首尾元素的指针双向联结起来,从而允许向前向后两个方向进行遍历。插入和删除效率高,随机访问支持不好。
  3) deque: 也表示一段连续的内存区域,支持高效在首部插入和删除元素,通过两级数据结构来实现,一级表示实际的容器,第二级指向容器的首和尾。如果容器的主要行为是在前段插入元素,则deque比vector效率高。
  
 下面是选择顺序容器类型的一些准则
  1.如果我们需要随机访问一个容器则vector要比list好得多 。
  2.如果我们已知要存储元素的个数则vector 又是一个比list好的选择。
  3.如果我们需要的不只是在容器两端插入和删除元素则list显然要比vector好 。
  4.除非我们需要在容器首部插入和删除元素否则vector要比deque好。
  5.如果只在容易的首部和尾部插入数据元素,则选择deque。
  6.如果只需要在读取输入时在容器的中间位置插入元素,然后需要随机访问元素,则可考虑输入时将元素读入到一个List容器,接着对此容器重新拍学,使其适合顺序访问,然后将排序后的list容器复制到一个vector容器中。

3. 链表与数组区别

  链表和数组一样是一种数据结构,如何使用完全基于你的应用需求。
  链表和C++语言本身没有任何联系。很多语言都可以实现链表数据结构。
  我讲一下数据和链表的区别有可能帮助你对链表的使用有个感觉。
  数组是将元素在内存中连续存放,由于每个元素占用内存相同,所以你可以通过下标迅速访问数组中任何元素。但是如果你要在数组中增加一个元素,你需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中。同样的道理,如果你想删除一个元素,你同样需要移动大量元素去填掉被移动的元素。
  链表恰好相反,链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起。比如:上一个元素有个指针指到下一个元素,以此类推,直到最后一个元素。如果你要访问链表中一个元素,你需要从第一个元素开始,一直找到你需要的元素位置。但是增加和删除一个元素对于链表数据结构就非常简单了, 只要修改元素中的指针就可以了。
  从上面的比较你可以看出,如果你的应用需要快速访问数据,很少或不插入和删除元素,你就应该用数组;相反, 如果你的应用需要经常插入和删除元素你就需要用链表数据结构了。然后你自己可以想一想什么样的应用用链表合适。


参考文献:
http://blog.163.com/zsy_19880518/blog/static/18525812720127293359291/ 
http://blog.csdn.net/hero_myself/article/details/52304794

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

C++中数组、链表和vector等容器之间的区别 的相关文章

  • exp远程导出oracle数据,本地导入的方法(实测通过)

    一 单表导出和导入 1 单表导出数据 其中10 10 xxx xx是远程数据库的ip db是数据库用户名 work是数据库用户密码 invt head 是表名 远程导出表数据 进口 exp db work 10 10 xxx xx 1521
  • deepin 15.11 安装nvidia driver和cuda 10

    最近看新闻华为的笔记本在适配deepin系统 所以特地安装试玩 确实比ubuntu漂亮些 且适配了大量常用应用 感觉可以不用切windows了 由于要用显卡开发deep learning相关应用 所以首先得安装闭源驱动和cuda 下面是具体

随机推荐

  • 如何创建自己的SeetaFace Identification工程

    如何创建自己的SeetaFaceIdentification工程 不重点说明的流程和SeetaFace Alignment的教程是一样的 只是将相应的东西改为Identification文件下下面的东西 一 如何创建FaceIdentifi
  • BUCK同步整流

    图一 buck电路 开关电源相对于LDO来说具有输出电流大以及效率高等优点 由图一可以看到buck电路的损耗除了电感内阻 以及开关管SW的损耗 开关损耗 导通损耗 外还有二极管存在一定的损耗 在电压输入输出电压较大的情况下可以暂时不进行考虑
  • nvue页面的text标签显示多行文本

    uniapp中的nvue页面文本必须放在text标签里面 否则不能设置字体大小和颜色 且只能显示一行 如果想显示多行 则需要使用rich text标签 text和rich text如果需要显示省略号 可以使用lines和text overf
  • crontab定时任务执行未成功,手动执行却可以的问题解决

    Linux里定时任务crontab执行脚本未成功 手动在shell行执行可以成功 在工作中 我们在liunx的服务器环境上去用脚本来跑一些程序和服务 大部分在需要多次或者持续性 间断性的去跑 通过手动人为的方式去执行比较繁琐 比如在遇到程序
  • Win10 + C++ + Paddle进行OCR文字识别 Cmake编译

    1 下载文件并保存到D盘 1 1 PaddleOCR 项目文件下载1 1 2 下载推理模型 PaddleOCR 项目文件下载2 1 4 下载推理库 1 5 下载Opencv3 4 1 6 解压到指定目录 在系统变量 Path 的末尾添加 C
  • java压缩解压文件工具类

    controller中使用 PostMapping value importZip public Result
  • 新唐NUC980使用记录:U-Boot & Linux 编译与烧录(基于SPI NAND)

    文章目录 目的 U Boot编译 U Boot环境变量 Linux编译 默认设置 使用SPI NAND剩余分区 使用SPI NAND YAFFS2作为rootfs 打包镜像 总结 目的 这篇文章中将测试在 NUC980 中运行Linux系统
  • 7.Django如何实现跨域

    文章目录 1 同源策略 2 简单 复杂请求 3 CORS 4 如何解决跨域 方法一 添加响应头Access Control Allow Origin 方法二 使用扩展django cors headers 5 跨域实现流程 1 同源策略 同
  • 进程的三种状态详解

    1 进程的三种基本状态 进程在运行中不断地改变其运行状态 通常 一个运行进程必须具有以下三种基本状态 1 就绪 Ready 状态 当进程已分配到除CPU以外的所有必要的资源 只要获得CPU便可立即执行 这时的进程状态称为就绪状态 2 执行
  • Halcon图像减法——找两图像的不同

    一 实验要求 1 写程序找出下面两幅图像的不同之处 用红色表示 二 代码实现 read image Image C Users 86159 Pictures Saved Pictures 1作业图片 5 1 1 jpg 照片尺寸 515 6
  • 计算机卡慢解决方法,电脑慢的快速解决办法 四种方法电脑速度变快10倍

    简介 关于电脑慢的快速解决办法 四种方法电脑速度变快10倍的相关装修疑问 相信很多朋友对此并不是非常清楚 为了帮助大家更好的了解相关装修知识要点 小编特此为大家整理出如下讲解内容 希望下面的装修内容对大家有所帮助 如果有更好的建议或者想看更
  • C# 中感叹号 (!) 的一些常见用法

    在C 中 感叹号 有多种用途 具体取决于上下文 下面是一些常见的用法和示例 逻辑非运算符 感叹号可以用作逻辑非运算符 用于取反布尔值 它将true转换为false 将false转换为true 示例 bool isTrue true bool
  • Git子模块操作手册

    Git子模块操作手册 一 添加子模块并提交含子模块项目 1 在当前项目目录下执行以下命令 gitsubmodule add https gitee com tianbu git module git 说明 命令分为三部分 gitsubmod
  • Web安全—敏感信息泄露

    敏感信息泄露常见场景 敏感信息 后台URL地址 操作系统类型 数据库类型 脚本类型 接口信息等 常见场景 1 通过访问URL下的目录 可以直接列出目录下的所有文件列表 目录遍历 index of 2 构造输入错误的URL 服务端返回错误信息
  • cocos2dx中播放Armature动画

    ArmatureDataManager getInstance gt addArmatureFileInfo effect hitscreen hitscreen ExportJson boolPlayOnclickArmation onT
  • openresty学习笔记

    openresty 简介 openresty 是一个基于 nginx 与 lua 的高性能 web 平台 其内部 集成了大量精良的 lua 库 第三方模块以及大数的依赖项 用于 方便搭建能够处理超高并发 扩展性极高的动态 web 应用 we
  • QGIS的安装和中文设置

    安装 中文设置 安装 下载安装包 https www qgis org zh Hans site forusers download html 安装 输入镜像网址 选择版本 中文设置 在开始菜单中打开 QGIS Desktop 3 10 1
  • pytorch 权重weight 与 梯度grad 可视化

    查看特定layer的权重以及相应的梯度信息 打印模型 观察到model下面有module的key module下面有features的key features下面有 0 的key 这样就可以直接打印出weight了 在pdb debug界面
  • 1004. 成绩排名 (20)

    读入n名学生的姓名 学号 成绩 分别输出成绩最高和成绩最低学生的姓名和学号 输入格式 每个测试输入包含1个测试用例 格式为 第1行 正整数n 第2行 第1个学生的姓名 学号 成绩 第3行 第2个学生的姓名 学号 成绩 第n 1行 第n个学生
  • C++中数组、链表和vector等容器之间的区别

    1 各个容器之间区别 vector 连续的空间存储 可以使用 操作符 快速的访问随机的元素 快速的在末尾插入元素 但是在序列中间岁间的插入 删除元素要慢 而且如果一开始分配的空间不够的话 有一个重新分配更大空间 然后拷贝的性能开销 dequ