STL 容器区别:vector、list、deque、set、map的底层实现

2023-05-16

文章转自:http://blog.csdn.net/lmh12506/article/details/8445025

1、set和map

比较

\setmap
共同点都是无序的保存元素,只是通过它提供的借口对里面的元素进行访问,底层都是采用红黑树实现
不同点集合,用来判断某一个元素是不是在一个组里面,使用的比较少映射,相当于字典,把一个值映射成另一个值,可以创建字典

总结:

a. 优点

  • 查找某一个数的时间为 O(logn)
  • 遍历时采用iterator,效果不错

b. 缺点

  • 每次插入值的时候,都需要调整红黑树,效率有一定影响

2、vector

概述

是动态数组,在堆中分配内存,元素连续存放,有保留内存,如果减少大小后,内存也不会释放;如果新值大于当前大小时才会重新分配内存。

特点

  • 拥有一段连续的内存空间,并且起始地址不变,因此能够非常好的支持随机存取,即[]操作符,但是由于它的内存空间是连续的,所以在头部和中间进行插入和删除操作会造成内存块的拷贝,另外,当该数组的内存空间不够时,需要重新申请一块足够大得内存并且进行内存的拷贝,这些都大大的影响了vector的效率。
  • 对头部和中间进行添加删除元素操作需要移动内存,如果你得元素是结构或类,那么移动的同时还会进行构造和析构操作,所以性能不高
  • 对任何元素的访问时间都是 O(1) ,所以常用来保存需要经常进行随机访问的内容,并且不需要经常对中间元素进行添加删除操作
  • 属性与string差不多,同样可以使用capacity看当前保留的内存,使用swap来减少它使用的内存,如push_back 1000个元素,capacity返回值为16384
  • 对最后元素操作最快(在后面添加删除元素最快),此时一般不需要移动内存,只有保留内存不够时才需要

总结

  • 需要经常随机访问且不用经常对中间元素删除插入时使用vector
  • 如果元素是结构或类,最好是将结构或类的指针放入vector中,这样不仅能够节省空间,而且可以避免移动时构造和析构操作
  • 删除元素时采用后面的元素覆盖前面的元素的方法可以提高效率

    3、list

    概述

    双向链表,元素也存放在堆中,每个元素都是放在一块内存中,他的内存空间可以是不连续的,通过指针来进行数据的访问,这个特点使得它的随机存取变得非常没有效率,因此它没有提供[]操作符的重载。但是由于链表的特点,它可以很有效率的支持任意地方的删除和插入操作。

    特点

  • 没有空间预留习惯,所以没分配一个元素都会从内存中分配,没删除一个元素都会释放它占用的内存
  • 在哪里添加删除元素性能都很高,不需要移动内存,当然也不需要对每个元素都进行构造与析构了,所以常用来做随机插入和删除操作容器
  • 访问开始和最后两个元素最快,其他元素的访问时间都是 O(n)

    总结

  • 如果经常进行添加和删除操作并且不经常随机访问的话,使用list
  • list<指针>完全是性能最低的做法,还不如直接使用list<对象>或使用vector<指针>好,因为指针没有构造与析构,也不占用很大内存

    4、deque

    概述

    【堆1】

    【堆2】

    【堆3】

    特点

  • 支持[]操作符,也就是支持随机存取,有比较搞的随机存取速度,由于deque需要处理内部跳转,因此速度上没有vector快
\dequevector
组织方式按页或块来分配存储器的,每页包含固定数目的元素分配一段连续的内存来存储内容
效率即使在容器的前端也可以提供常数时间的insert和erase操作,而且在体积增长方面也比vector更具有效率只是在序列的尾端插入元素时才有效率,但是随机访问速度要比deque快
  • 支持两端操作push_back、push_front、pop_back、pop_front等,并且效率与list差不多

    总结

  • 如果既需要随机存取,又需要两端数据插入和删除,则应该使用deque

    5、总结

\vectoristdeque
特点快速的随机存取,快速的在最后插入删除元素可以快速的在任意位置添加删除元素,只能快速的访问最开始和最后面的元素在开始和最后添加删除元素一样快,并且提供了随机访问的方法
适用需要高效的随机存取,不在于插入删除的效率需要大量的插入和删除操作,不关心随机存取需要随机存取,也需要高效的在两端进行插入删除操作
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STL 容器区别:vector、list、deque、set、map的底层实现 的相关文章

随机推荐

  • 同一寄存器不同位域赋值的两种方法

    当一个寄存器有不同位域时 xff0c 我们需要给不同位域赋值 如何赋值方便呢 xff1f 下面有两种方法 xff0c 总结一下 个人觉得位域写法更简洁 整体寄存器法 typedef struct StrNa uint32 t reg1 re
  • mavlink解析

    之前看了mavlink协议 xff0c 网上关于mavlink的资料不多 本系列共三篇 xff0c 这是第一篇 本文大概总结了下对mavlink协议的理解 以下如不说明都是说mavlink v1 0版本 首先附上mavlink的各个消息的简
  • Tomcat部署及优化

    目录 1 Tomcat概述 1 Tomcat的概念 2 Tomcat的核心组件 3 Java Servlet 的概念 4 JSP的概念 5 Tomcat中最顶层的容器 server 6 四个子容器的作用 7 Tomcat请求过程 2 Tom
  • STC89C52系列单片机内部资源——串口通信

    计算机通信是将计算机技术和通信技术的相结合 xff0c 完成计算机与外部设备或计算机与计算机之间的信息交换 可以分为两大类 xff1a 并行通信与串行通信 并行通信通常是将数据字节的各位用多条数据线同时进行传送 并行通信控制简单 传输速度快
  • 用TCP/UDP 网络调试助手(PC版)无法获取网页信息

    以前的网页均是http开头的 xff0c 是没有加密的 xff0c 以前用GET就能获取网页的信息 xff0c 但是现在的基本是https开头的 xff0c 是加密的 xff0c 所以现在用以前的方法 xff0c 只能返回301错误 现在想
  • Ubuntu 20.04安装Ros Noetic及Ubuntu 18.04安装ROS Melodic(两版本详细填坑)

    Ubuntu 20 04安装Ros Noetic及18 04安装ROS Melodic 表1 1 ROS的历史版本 1 设置安装源2 添加秘钥3 更新列表4 开始安装5 配置ROS环境变量6 安装rosinstall6 1 初始化核心组件r
  • linux 根文件系统,根设备,sys_open, sys_read, sys_write, sys_mount, sys_mknod

    笔者语 xff1a 1 内容涉及比较多 xff0c 自己也没有分章节 xff0c 因为觉得这些内容关联性很强 xff0c 自己也懒的去弄了 2 本文涉及以下内容 xff1a 2 1 内核启动过程中 xff0c 第一个文件系统为rootfs
  • uboot的配置(make xxx_config)和编译(make)工程解读

    uboot编译三步走 make xxx configmakemake install 第一步make xxx config 这一步是产生板子的配置文件 我们假设是配置ast2500evb板子 xff0c 那么这里的配置命令就是 make a
  • uboot启动之第一次运行C函数到uboot重定位

    接上一篇博文 uboot启动流程之上电启动到第一次准备好C语言运行环境 xff0c 本文从board init f 开始 board init f定义在uboot common board f c中 CONFIG SYS GENERIC B
  • pci总线扫描及pci网卡驱动

    本文讲述的基于intel 总线架构的硬件架构为例来说明linux是如何扫描总线上的PCI设备 CPU通过前端总线FS连接到北桥芯片North Bridge Chip 又称host Bridge 北桥芯片本身也是PCI总线0上的PCI设备 北
  • k8s下POD之间的通信过程

    本文主要描述同一个node之内的pod之间的通信 xff0c 以及不同node之间的pod之间的通信 同一个 node 上的不同 pod 之间的通信 xff1a 假设上图的POD A要和POD B 通信 POD A 发送一个包 xff0c
  • bash: ./<one_executable_file>: no such file or directory

    关于这个问题 xff0c 原因很多 但大部分的资料都是说PATH环境变量坏掉了 xff0c 或者 etc profile坏掉了 但其实 xff0c 还有一种原因 xff0c 就是你的可执行程序 lt one executable file
  • linux下动态库so的debug方式

    1 查看哪些进程使用了特定的动态库so lsof lib arm linux gnueabi libselinux so 1 COMMAND PID USER FD TYPE DEVICE SIZE OFF NODE NAME init 1
  • linux usb gadget driver代码

    本文基于linux 5 4 124 aspeed 2600 BMC 的代码实现来描述arm结构下的gadget driver 在读之前 xff0c 我们需要了解什么是usb gadget driver xff0c 以及它的作用 从英文字面上
  • 【毕业设计】深度学习社交安全距离检测系统 - python opencv

    文章目录 0 前言1 课题背景2 实现效果3 相关技术3 1 YOLOV43 2 基于 DeepSort 算法的行人跟踪 4 最后 0 前言 x1f525 Hi xff0c 大家好 xff0c 这里是丹成学长的毕设系列文章 xff01 x1
  • 关于进程和线程对于全局变量共享的问题学习总结

    进程和线程的共享 本文档可以说明以下几个问题 xff1a 问题一 xff1a 多进程编程中 xff0c 不同进程是否可以通过全局变量来通信 问题二 xff1a 多线程编程中 xff0c 不同线程是否可以通过全局变量来通信 xff1f 在说明
  • C语言调用so动态库的两种方式

    方式1 xff1a 类似静态库的调用 xff08 使用头文件 xff09 这种方式生成的程序会在启动时候就加载so动态库 add h span class hljs keyword int span add span class hljs
  • GPS RTK测量定位原理

    转自 xff1a https baijiahao baidu com s id 61 1603136753092877848 amp wfr 61 spider amp for 61 pc 手机定位是什么原理 xff1f 实时动态工程测量是
  • STM32学习笔记 - 串口的初始设置

    STM32学习笔记 串口的初始设置 1 声明结构体变量 GPIO InitTypeDef GPIO InitStructure GPIO InitTypeDef是一个结构体变量 xff0c 包括GPIO Pin xff08 u16类型 xf
  • STL 容器区别:vector、list、deque、set、map的底层实现

    文章转自 xff1a http blog csdn net lmh12506 article details 8445025 1 set和map 比较 setmap共同点都是无序的保存元素 xff0c 只是通过它提供的借口对里面的元素进行访