从时间复杂度的角度出发,list和vector之间查找,插入,删除等数据操作的区别
list和vector是STL(标准模板库)中常用的两种序列容器,它们各自在不同类型的操作上有着不同的优势。下面是list和vector在不同操作上的擅长之处:
list的擅长操作
插入和删除操作:list是一个双向链表,插入和删除元素时只需要调整相邻节点的指针,因此在中间或任意位置插入或删除元素时效率很高,时间复杂度为O(1)。
迭代器失效风险低:由于数据存储在节点中,当插入或删除元素时,并不会使得迭代器失效,使得list在需要频繁插入、删除或移动元素并需要使用迭代器访问数据时是一个不错的选择。
不需要连续内存:list的元素在内存中不需要连续存储,这使得list更适合于大量的动态插入和删除操作。
vector的擅长操作
随机访问:vector是一个动态数组,支持高效的随机访问,通过索引(下标)可以在O(1)的时间复杂度内访问元素,使其非常适合需要快速访问元素而不需要频繁插入和删除操作的场景。
快速末尾操作:在末尾进行插入和删除操作时,vector的效率很高,插入和删除末尾元素的时间复杂度为摊销的O(1)。
连续内存存储:vector中的元素是连续存储的,这样有利于提高缓存命中率,从而提高访问速度,特别是在大规模数据集上可能会有更好的性能表现。
结论
在选择使用list还是vector时,需要根据具体应用场景的需求进行合理的选择。如果需要频繁的插入和删除操作,尤其是在中间位置,那么list可能更适合。如果需要高效的随机访问和在末尾进行插入/删除操作,那么vector可能更适合。同时,在实际使用中,也可以根据具体问题的特点结合使用这两种容器,以发挥它们各自的优势来提高程序性能。
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
从时间复杂度的角度分析,list和vector各自的数据操作性能有显著不同,主要由于它们的内部数据结构导致。list是一个双向链表,而vector是一个动态数组。下面是对这两种容器中查找、插入和删除操作的比较:
查找
Vector (std::vector): 查找(无论是顺序查找还是使用算法如二分查找)的时间复杂度通常是O(n),因为最坏情况下可能需要遍历整个数组。如果数组已排序,可以使用二分查找,时间复杂度为O(log n)。
List (std::list): 查找的时间复杂度是O(n),因为list是一个链表,无法直接访问中间的元素,必须从头(或尾)开始遍历。
插入
Vector (std::vector):
在vector的末尾插入元素的复杂度是摊销的O(1)。摊销是因为vector可能需要扩容,这需要复制现有元素到一个新的更大的数组中,但这种情况不频繁发生。
在vector的中间或开始位置插入元素的复杂度是O(n),因为插入位置之后的所有元素都需要向后移动以腾出空间。
List (std::list): 插入的时间复杂度是O(1),如果你已经有了指向插入位置的迭代器。这是因为链表插入不需要移动其他元素,只要修改前后节点的指针即可。
删除
Vector (std::vector):
从末尾删除元素的时间复杂度是O(1)。
从vector的中间或开始位置删除元素的复杂度是O(n),因为删除元素后,后面的所有元素都需要向前移动来填补空位。
List (std::list): 删除的时间复杂度是O(1),如果你已经有了指向被删除元素的迭代器。类似于插入操作,删除不需要移动其他元素,仅需修改相邻节点的指针。
总结
总的来说,list在插入和删除操作上特别高效,特别是在列表的中间或特定位置操作时。而vector在末尾插入或删除操作上很高效,且支持快速随机访问,使得查找操作(特别是经过优化的查找算法)在已排序的数组中效率更高。因此,在选择使用list还是vector时,需要考虑应用的需求,特别是操作的类型(插入/删除的位置,访问的频繁程度)以及对时间效率的要求。
从时间复杂度的角度出发,list和vector之间查找,插入,删除等数据操作的区别的更多相关文章
- 对博弈活动中蕴含的信息论原理的讨论,以及从熵角度看不同词素抽象方式在WEBSHELL文本检测中的效果区别
1. 从赛马说起 0x1:赛马问题场景介绍 假设在一场赛马中有m匹马参赛,令第i匹参赛马获胜的概率为pi,如果第i匹马获胜,那么机会收益为oi比1,即在第i匹马上每投资一美元,如果赢了,会得到oi美元 ...
- C++ Primer : 第九章 : vector变长、string的其他操作以及容器适配器
vector变长机制.string的其他构造方法,添加.替换和搜索操作,string比较和数值转换,最后是容器适配器. vector对象是如何增长的 vector和string类型提供了一些成员函数, ...
- STL中vector的赋值,遍历,查找,删除,自定义排序——sort,push_back,find,erase
今天学习网络编程,那个程序中利用了STL中的sort,push_back,erase,自己没有接触过,今天学习一下,写了一个简单的学习程序.编译环境是VC6.0 这个程序使用了vect ...
- 与焊接厂交流——从生产角度出发的PCB设计心得
上周的时候,去了趟加工厂盯电路板的焊接进度.然后在闲余的时候,跟焊接厂的工程师交流了一下,工程师从生产的角度,说了几个值得注意的事项: 1.元件的焊盘应该要窄长,不能过宽.因为,在过机表贴时,焊盘上的 ...
- 从实力的角度出发来思考这道AOP题目
文/楠木大叔 技术更迭,一往无前.技术人总是要不断学习以适应社会的发展和行业对我们的要求.每隔一段时间,就会有纷至沓来的新技术,新知识,新概念,我们应该如何应对,是被逼到墙角,还是主动出击? 导读 从 ...
- [html] 前端角度出发做好SEO需要考虑什么
Meta标签优化 主要包括主题(Title),网站描述(Description),和关键词(Keywords).还有一些其它的隐藏文字比如Author(作者),Category(目录),Languag ...
- 从前端角度出发有哪些注意事项有利于SEO?
1.提高页面加载速度. 能用css解决的不用背景图片,背景图片也尽量压缩大小,可以几个icons放在一个图片上,使用background-position找到需要的图片位置.可以减少HTTP请求数,提 ...
- 毕大从自身设计HSF的角度出发谈服务化这回事
服务化的过去.现在和未来 原创: bluedavy HelloJava 9月18日 服务化毫无疑问是技术圈一直火热的buzzword,而且其实已经非常多年了,这在日益更新的技术圈还挺神奇的,作为在服 ...
- c++ STL中的vector与list为什么没有提供find操作?
map里有,set里也有,vector,list没有,太不公平了吧. 其实应该考虑为什么map,set里有find操作. include<algorithm>里有通用的find操作,通用的 ...
- vector中的元素删除
删除vector中的元素,最容易的方法就是使用vector的erase()函数. vector vec;for ( vector::iterator iter = vec.begin(); iter! ...
随机推荐
- offline 2 online | 重要性采样,把 offline + online 数据化为 on-policy samples
论文标题:Offline-to-Online Reinforcement Learning via Balanced Replay and Pessimistic Q-Ensemble CoRL 20 ...
- 吉特日化MES 与周边系统集成架构
作者:情缘 出处:http://www.cnblogs.com/qingyuan/ 关于作者:从事仓库,生产软件方面的开发,在项目管理以及企业经营方面寻求发展之路 版权声明:本文版权归作者和博客园 ...
- android mvvm实例解析
MVVM架构,将整个应用分为三层,View层,VM层,Model层.其中View层单向引用VM层,VM层单向引用Model层.如上图. 单向引用,而非双向引用,这是MVVM与MVP最大的区别.View ...
- Linux Ubuntu 遇到的一些问题
Ubuntu 国内下载地址:https://mirrors.tuna.tsinghua.edu.cn/# 1. 安装一些常用的软件时,需要下载 amd.deb 类型的包,并使用下面命令安装 sudo ...
- 循环掌控:深入理解C语言循环结构,高效实现重复性任务
欢迎大家来到贝蒂大讲堂 养成好习惯,先赞后看哦~ 所属专栏:C语言学习 贝蒂的主页:Betty's blog 引言 前面贝蒂带大家了解了选择结构,今天就来为大家介绍循环结构,也就是我们熟悉的while ...
- Acrobat 教程
https://helpx.adobe.com/cn/acrobat/using/pdf-form-field-properties.html
- 【LeetCode排序专题01】由旋转数组的最小数字引出的关于排序算法的讨论(冒泡排序、二分查找+暴力法)
旋转数组的最小数字 剑指 Offer 11. 旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 给你一个可能存在 重复 元素值的数组 numbers ,它原来是一 ...
- 【Azure 应用服务】Azure SignalR 是否可以同时支持近十万人在线互动
什么是 Azure SignalR 服务? Azure SignalR Service 简化了通过 HTTP 向应用程序添加实时 Web 功能的过程. 这种实时功能允许服务将内容更新推送到连接的客户端 ...
- X86模拟龙芯与编译 .NET CoreCLR
目录 .NET 收到一台龙芯机器 编译 CoreCLR 环境要求 部署虚拟机与环境 Linux 安装 KVM 下载需要的文件 启动模拟器 下载 CoreCLR 尝试编译 CoreCLR 前段时间得知龙 ...
- [java] Tomcat 启动失败 Error: error while reading constant pool for .class: unexpected tag at #
表现 公司服务器今天启动tomcat失败, 看catalina.out文件里面报错 java.lang.ClassFormatError: Unknown constant tag 101 in cl ...