C++ STL中各种数据结构操作的时间复杂度比较

2023-05-16

C++ STL中各种数据结构操作的时间复杂度比较

 访问push_back()push_front()insert()pop_back()pop_front()erace()find()
listO(n)O(1)O(1)O(1)O(1)O(1)O(1) 
vectorO(1)O(1)\O(n)O(1)\O(n) 
dequeO(1)O(1)O(1)O(n)O(1)O(1)O(n) 
mapO(log n)\\O(log n)\\O(log n)O(log n)
multimap同上  同上  同上同上
setO(log n)\\O(log n)\\O(log n)O(log n)
multiset同上  同上  同上同上

补充:

map, set, multimap, and multiset

上述四种容器采用红黑树实现,红黑树是平衡二叉树的一种。不同操作的时间复杂度近似为:

插入: O(logN)

查看:O(logN)

删除:O(logN)

hash_map, hash_set, hash_multimap, and hash_multiset

上述四种容器采用哈希表实现,不同操作的时间复杂度为:

插入:O(1),最坏情况O(N)。

查看:O(1),最坏情况O(N)。

删除:O(1),最坏情况O(N)。


1. vector

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

扩容方式:
                1、倍数开辟二倍的内存
                2、旧的数据开辟到新内存
                3、释放旧的内存
                4、指向新内存

特点:

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

2. list(双向循环链表)

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

优点:可以在任意位置进行插入删除

缺点:访问效率低

特点:

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

 

3.deque(双向队列) 

是一种优化了的、对序列两端元素进行添加和删除操作的基本序列容器。它允许较为快速地随机访问,但它不像vector 把所有的对象保存在一块连续的内存块,而是采用多个连续的存储块,并且在一个映射结构中保存对这些块及其顺序的跟踪。向deque 两端添加或删除元素的开销很小。它不需要重新分配空间,所以向末端增加元素比vector 更有效。

deque 是对vector 和list 优缺点的结合,它是处于两者之间的一种容器。

特点:

  • 随机访问方便;
  • 可以在内部进行插入和删除操作;
  • 可以在两端进行push和pop

4.map

map由红黑树实现,其元素都是键值对,每个元素的键是排序的准则,每个键只能出现一次,不允许重复

特点

1)元素为键值对形式,键和值可以是任意类型

2)因为key有序,所以可以通过二分对key进行快速查找

3)增加和删除结点对迭代器的影响很小,除了当前结点是迭代器指向的结点

4)对于迭代器来说,可以修改值,但是不能修改key

优缺点和适用场景

优点:适用平衡二叉树实现,便于元素查找,而且可以把值映射到另外一个值,可以创建字典

缺点:每次插入都需要调整红黑树,对效率存在一定的影响

适用场景:适用于需要储存一个字典,并要求方便的根据key找value的场景

5. set

set由红黑树实现,其内部元素依照其值自动排序,每个元素只出现一次,不允许重复(红黑树是平衡二叉树的一种)

特点

1)元素有序

2)无重复元素

3)插入删除操作的效率比序列容器高,因为对于关联容器来说,不需要做内存的拷贝和内存的移动

优缺点及适用场景

优点:使用平衡二叉树实现,便于元素查找,而且保持了元素的唯一性,支持自动排序

缺点:每次插入元素,都需要调整红黑树,效率有一定的影响

适用场景:适用与经常查找一个元素是否在某集群中并且不要排序的场景

6. multimap

multimap和map相同,但允许重复元素,也就是说multimap可包含多个键值(key)相同的元素。这里不再做过多介绍。 

7. multiset

multiset和set相同,只不过它允许重复元素,也就是说multiset可包括多个数值相同的元素。

(可用于求数列中最小的k个数——面试题40)


其他:

stack,queue,prioroty_queue都属于容器配接器,是由容器按照特殊的逻辑实现的

小结:

1)如果需要高效的随机存取,不在乎插入和删除的效率,使用vector

2)如果需要大量的插入和删除元素,不关心随机存取的效率,使用list
3)如果需要随机存取,并且关心两端数据的插入和删除效率,使用deque
4)如果打算存储数据字典,并且要求方便地根据key找到value,一对一的情况使用map,一对多的情况使用multimap
5)如果打算查找一个元素是否存在于某集合中,唯一存在的情况使用set,不唯一存在的情况使用multiset

 

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

C++ STL中各种数据结构操作的时间复杂度比较 的相关文章

随机推荐

  • ROS中控制机械臂抓取目标例程

    在上一个博文中介绍了一个简单的目标识别的例子 xff0c 在这篇博客中 xff0c 例如是别的结果 xff0c 完成机械臂的抓取控制 xff0c 主要进行程序的分析和学习 包含的头文件 xff1a include lt ros ros h
  • STM32_Debug 使用ST-Link进行调试出现Error:Flash Download Failed-"Cortex-M3" 解决方案

    在Debug窗口依次注意以下几个点 xff1a 1 选择与主控芯片相配套的芯片 2 选择ST Link Debugger 此处注意该页面最下面一行可不更改 xff08 亲测有效 xff09 3 接上图点击进入Setting xff0c 依次
  • 标准外设库(STD库)、HAL库、LL库三者区别

    转自 xff1a https blog csdn net zcshoucsdn article details 54613202 2018 1 19 HAL库详解见STM32之HAL库详解 及 手动移植 STM32 Embedded Sof
  • FOC矢量控制

    FOC xff08 Filed Oriented Control xff09 是采用数学方法实现三相马达的力矩与励磁的解耦控制 主要是对电机的控制电流进行矢量分解 xff0c 变成励磁电流 I d Id 之后我将详细介绍一下这个算法的数学原
  • Linux网络编程8——对TCP与UDP的简易封装

    引言 每次使用socket通信 xff0c 都会有很对相似的操作 本文 xff0c 会对TCP与UDP通信做一简单封装 xff0c 并生成动态库 代码 my socket h ifndef MY SOCKET H define MY SOC
  • 分分钟带你入门无刷电机控制_P-NUCLEO-IHM001套件评测使用

    终于有时间将前段时间把有关ST公司的分分钟带你入门无刷电机控制 P NUCLEO IHM001套件评测的资料系统的整理一下 刚一开始接触接触这个套件的时候感觉这是什么鬼 xff0c 可以实现正弦波矢量控制 xff1f 这么强 xff0c 慢
  • SiamFC代码配置复现

    写在前面 最近在研究SiamRPN xff0c 究其根本 xff0c CNN依托于AlexNet骨架 xff0c 所以花些功夫研究以下SiamFC代码 xff0c 将其阶段性复现 Tracking only 关于GPU显卡配置 cudn和c
  • PySOT

    写在前面 期待已久的PySOT终于放上了code xff0c 高兴ing xff0c 赶忙进行相应的配置加以复现 xff0c 不得不说 xff0c 作者真的很贴心 xff0c 把配置环境的指令封装成脚本 xff0c 直接按需配置即可 但是在
  • 【Linux】SocketCan c语言编程

    前言 为了能够对Socket CAN的深入理解 xff0c 我们需要了解Socket的机制 Socket的中文翻译为 插座 xff0c 在计算机世界里称为套接字 Socket最初是作为网络上不同主机之间进程的通信接口 xff0c 后来应用越
  • VMWare虚拟机网络配置及虚拟机远程rviz显示雷达数据

    虚拟机网络配置 1 工具 环境 本机 xff1a Windows 10 64位虚拟机 xff1a VMware Workstation xff0c Ubuntu 18 04 2 Windows配置 WLAN部分 网络和Internet配置
  • 2022数学建模国赛B题思路分析

    分享一下 xff0c 仅供参考借鉴 xff0c 切勿直接使用 xff01 致谢一下全糖奶茶屋 xff01 一 问题重述 1 1 问题背景 由于无人机集群在遂行编队飞行时 应尽可能的避免外界干扰 因此需要尽可能的保持电磁静默减少电磁波信号的发
  • 利用Visual Studio创建C语言dll

    利用VS2019创建dll方法 动态链接库的定义及意义如何在VS创建dll入口函数DLLMain如何创建导出函数动态调用导出函数 动态链接库的定义及意义 动态链接库 xff08 Dynamic Link Library 或者 Dynamic
  • Human-in-the-Loop Optimization of Exoskeleton Assistance Via Online Simulation of Metabolic Cost

    Human in the Loop Optimization of Exoskeleton Assistance Via Online Simulation of Metabolic Cost 文章来源https ieeexplore ie
  • Dynamical Movement Primitives (DMP) 总结

    Dynamical Movement Primitives DMP 总结 概述 DMP通过将动态系统建立为 弹簧阻尼系统 43 非线性控制项的方式 f f f xff0c 实现了对示教数据的建模 具体贡献如下 xff1a 提供了一种简单的非
  • Probabilistic Movement Primitives (ProMP) 总结

    概述 文章通过在DMP的基础上增加随机项 xff0c 并通过EM算法求解得到符合示教数据的参数 一 模型介绍 1 系统方程 假设示教数据为 61 q t
  • 一些有用的数学定理

    法托引理 xff08 Fatou Theorem xff09 设 f n f n f n 是非负可测函数 xff0c 那么
  • 爬取需要登录的网站

    爬虫在采集网站的过程中 xff0c 部分数据价值较高的网站 xff0c 会限制访客的访问行为 这种时候建议通过登录的方式 xff0c 获取目标网站的cookie xff0c 然后再使用cookie配合代理IP进行数据采集分析 1 使用表单登
  • Makefile和Cmake的联系与区别

    CMake是一种跨平台编译工具 xff0c 比make更为高级 xff0c 使用起来要方便得多 CMake主要是编写CMakeLists txt文件 xff0c 然后用cmake命令将CMakeLists txt文件转化为make所需要的m
  • STM32内部寄存器、储存器、C对寄存器的封装

    STM32内部寄存器 储存器 C对寄存器的封装 STM32的地址空间可以分为8个 xff0c 分别是Block0 Block7 xff0c 其中Block2是应用于外设的存储器 xff0c 也是主要学习的内容 存储器映射 存储器的地址由厂商
  • C++ STL中各种数据结构操作的时间复杂度比较

    C 43 43 STL中各种数据结构操作的时间复杂度比较 访问push back push front insert pop back pop front erace find listO n O 1 O 1 O 1 O 1 O 1 O 1