list vector
vector 表示一段连续的内存区域,每个元素被顺序存储在这段内存中。对vector 的随机访问(比如先访问元素5 然后访问15 然后再访问7 等等)效率很高,因为每次访问离vector起始处的位移都是固定的。但是,在任意位置,而不是在vector 末尾插人元素,则效率很低,因为它需要把待插入元素右边的每个元素都拷贝一遍。类似地删除任意一个而不是vector的最后一个元素,效率同样很低,因为待删除元素右边的每个元素都必须被复制一遍。这种代价对于大型的复杂的类对象来说尤其大(一个deque 也表示一段连续的内存区域但是与vector 不同的是它支持高效地在其首部插入和删除元素它通过两级数组结构来实现一级表示实际的容器第二级指向容器的首和尾)。
list 表示非连续的内存区域,并通过一对指向首尾元素的指针双向链接起来,从而允许向前和向后两个方向进行遍历。在list 的任意位置插入和删除元素的效率都很高。指针必须被重新赋值,但是,不需要用拷贝元素来实现移动。另一方面,它对随机访问的支持并不好。访问一个元素需要遍历中间的元素,另外每个元素还有两个指针的额外空间开销。下面是选择顺序容器类型的一些准则:
1.如果我们需要随机访问一个容器则vector 要比list 好得多
2.如果我们已知要存储元素的个数则vector 又是一个比list 好的选择
3.如果我们需要的不只是在容器两端插入和删除元素,则list 显然要比vector 好
4.除非我们需要在容器首部插入和删除元素否则vector 要比deque 好
list 以简单方式增长。每当一个新对象被插入到list 中时,插入处的两个元素的前指针和后指针被重新赋值为指向新对象,新对象的前后指针被初始化为指向这两个元素。list 只占有其包含的元素所必需的存储区。额外的开销有两个方面:与每个值相关联的两个附加指针以及通过指针进行的间接访问
C++ STL 提供了3个序列容器 :vector, deque, list
vector 中的元素是顺序存放的,所以随机访问很快,但是要插入和删除,这个时间复杂度就很高了,vector初始化时有一个capacity,如果元素个数超出capacity,那vector就会重新分配一个新的空间,并把旧值复制到新的空间中,释法原空间,这个也要耗费很多时间,所以如果你知道元素的最大值,最好用reserve()函数初始最大空间,避免重新分配空间造成的时间。
deque 几乎所有的操作都和vector一样,出了可以在头添加和删除,多了个push_front(), pop_front();
list 是双链表,元素在内存中是分散的不连续的,它使用指针left,right,指向前一个元素和后一个元素。所以要删除和添加只要动动指针,所以很快,但是因为是不连续的所以要访问一个元素,你只能遍历序列。
1、list不连续区域的双向链表,vector 连续的内存区域存储。
2、vector支持随机访问,list插入和删除操作效率较高
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!