list与vector的区别与优缺点

本文详细介绍了C++中list和vector两种容器的优缺点。vector支持下标随机访问,尾部插入删除高效,但头部操作代价大且存在扩容开销。list则在任何位置插入删除效率高,空间利用率佳,但不支持下标访问。根据不同的需求,如大量中间插入删除,推荐使用list;其他情况推荐vector。同时,文章提到了迭代器失效的情况,并给出了针对vector和list的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、vector结构上的优点:

  1. 由于底层结构是一块连续的空间,所以可以支持下标''[]''随机访问的形式。

  1. cpu高速缓存命中率高。

  1. 尾插尾删除效率高,相比list

二、vector结构上的缺点:

  1. 越靠近头部位置的插入、删除效率低。

  1. 扩容有消耗,存在一定的空间的浪费,无论是手动扩还是自动扩,一般来说扩二倍比较合适。

三、list结构上的优点:

  1. 任何位置的插入删除的效率比较高,相比list。

  1. 按需申请释放节点,空间利用率高,不存在扩容操作。

四、list结构上的缺点:

  1. 不支持下标随机访问。

  1. cpu高速缓存命中率低。

五、使用场景:

若存在大量的中间插入删除,考虑用list;否则用vector。list与vector互补配合。

六、迭代器失效(导致迭代器底层指针所指向的空间被销毁,而使用一块被释放的空间)场景:

  1. string:涉及到复制(assgin)、插入(insert)、尾插(push_back)、resize(改变容器大小)、resever(扩容)、erase(删除,特别是尾删)等以上操作,都有可能会导致string扩容,也就是说string底层原来旧空间被释放掉,而在打印时,it还使用的是释放之间的旧空间,在对it迭代器操作时,实际操作的是一块已经被释放的空间,而引起代码运行时崩溃。

解决方式:在以上操作完成之后,如果想要继续通过迭代器操作string中的元素,只需给it重新赋值 即可。

string虽然也有失效,但是只有小部分不常用的接口使用的迭代器,其余大多数常用接口设计的是下标(size_t pos)。一般不关注string的迭代器失效。

  1. vector:涉及到复制(assgin)、插入(insert)、尾插(push_back)、resize(改变容器大小)、resever(扩容)、erase(删除,特别是尾删)等以上操作,都有可能会导致vector扩容,也就是说vector底层原来旧空间被释放掉,而在打印时,it还使用的是释放之间的旧空间,在对it迭代器操作时,实际操作的是一块已经被释放的空间,而引起代码运行时崩溃。

解决方式:在以上操作完成之后,如果想要继续通过迭代器操作vecor中的元素,只需给it重新赋值 即可。

  1. list:有且仅有erase

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值