从时间复杂度的角度出发,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! ...
随机推荐
- Linux sed输出文件内容的某几行
命令: sed -n "开始行,结束行p" 文件名 sed -n '70,75p' 文件名 # 输出第70行到第75行的内容 sed -n '6p;26 ...
- C++ 单例模式以及内存管理
引用: https://zhuanlan.zhihu.com/p/37469260 https://www.cnblogs.com/xiaolincoding/p/11437231.html http ...
- CF1895
A 题意:你在数轴原点.有一个宝箱在 \(x\),钥匙在 \(y\).每移动一单位,耗费 \(1\) 时间.你可以到了 \(x\) 然后抱着宝箱走,但是抱着宝箱走的总路程不能超过 \(k\) 单位.如 ...
- Git识别文件权限修改
刚打开IDE,工作区的代码状态全部变成修改未提交的状态了?这是这么回事?这是因为Git忽略文件权限或者拥有者改变导致的git状态变化.默认Git会记录文件的权限信息,如果文件的权限信息被修改,在Git ...
- Hooks与普通函数的区别
Hooks与普通函数的区别 在这里的Hooks具体指的是自定义Hooks,自定义的Hooks与我们定义的普通函数类似,都可以封装逻辑,以实现逻辑的复用.Hooks实际上是一种特殊的函数,而由于Hook ...
- Oracle 分析函数详解(Analytic Functions)--示例部分
Analytic functions are commonly used in data warehousing environments. In the list of analytic funct ...
- Redhat6更改yum源
最近虚拟机中安装了redhat6.3企业版,自带的yum用不起来,软件都找不到. 网上搜了一下说是没付钱...,需要改下yum源.操作步骤如下: 1.切换到yum源存放目录 [root@rhel6 ~ ...
- APISIX介绍
APISIX是什么 Apache APISIX是Apache软件基金会下的云原生API网关,它兼具动态.实时.高性能等特点,提供了负载均衡.动态上游.灰度发布(金丝雀发布).服务熔断.身份认证.可观测 ...
- 记录问题:goland无法识别sdk的问题
goland版本:2020 go版本:1.20.3最新版 在goland中配置GOROOT时找不到sdk 解决版本: > cd /usr/local/go # 我本地go的安装目录 > c ...
- django之manage.py migrate无效的问题
问题 已有的model,迁移之后,想重新设置字段,于是将migrations文件夹中除__init__.py之外其他文件都删掉,并且把数据库中的表删除,再次执行以下步骤python manage.py ...