Logo lxn 的博客

博客

vector、list 和 deque对比-deepseek学案

...
lxn
2025-12-01 12:57:48

本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2025-05-09 08:02:08

在 C++ STL 中,vectorlistdeque 是三种常用的顺序容器,它们的相同点与不同点对比如下:


相同点

  1. 动态容器
    均支持动态扩容/缩容,无需手动管理内存,容量随元素增减自动变化。
  2. 顺序存储
    元素按插入顺序存储(逻辑连续),支持顺序遍历。
  3. 迭代器支持
    提供随机访问迭代器(vectordeque)或双向迭代器(list),支持 begin()/end() 遍历。
  4. 通用操作
    支持 push_back()pop_back()insert()erase()size()empty() 等基本操作。

不同点

特性 vector list deque
底层结构 动态数组 双向链表 分块数组(多个连续块)
随机访问 ✅ O(1) ❌ O(n) ✅ O(1)(接近 vector)
中间插入/删除 ❌ O(n)(需移动元素) ✅ O(1)(已知迭代器位置) ❌ O(n)(需移动元素)
头尾插入/删除 ✅ 尾端 O(1),头端 O(n) ✅ 头尾 O(1) ✅ 头尾 O(1)
内存连续性 ✅ 完全连续 ❌ 非连续(节点分散) ❌ 逻辑连续,物理分块
内存分配策略 扩容时重新分配整个数组 按需分配单个节点 按需分配内存块(无需全拷贝)
迭代器失效场景 扩容后全部失效 删除时仅当前元素迭代器失效 中间插入/删除可能导致失效
内存占用 最低(仅元素内存) 较高(含前后指针) 中等(含块指针表)

核心差异总结

  1. 访问模式

    • vector:适合频繁随机访问(如 v[i])和尾部操作。
    • deque:适合频繁头尾插入/删除,随机访问性能接近 vector
    • list:适合频繁中间插入/删除,但无法快速随机访问。
  2. 内存效率

    • vector:内存紧凑,缓存友好,但扩容成本高。
    • list:内存碎片化,但无扩容开销。
    • deque:折中设计,兼顾头尾操作和随机访问。
  3. 迭代器稳定性

    • list 的迭代器最稳定(除非元素被删除)。
    • vector 扩容后所有迭代器失效。
    • deque 在中间修改时可能局部失效。

典型应用场景

  • vector:需要快速随机访问(如数值计算、动态数组)。
  • list:需要频繁中间插入/删除(如 LRU 缓存链表)。
  • deque:需要高效头尾操作(如任务队列、滑动窗口)。

根据具体需求选择容器,可显著优化程序性能和内存效率。

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。