2.5、说一说如何选择顺序容器

1. 随机访问需求

  • • 优先选择vector或deque(支持operator[]/at等随机访问操作):
    • • vector:底层连续内存,缓存友好性最佳,随机访问速度最快。
    • • deque:分段连续内存,支持随机访问,但效率略逊于vector(需跨块指针跳转)。

2. 插入与删除操作位置

  • • 尾部操作为主+随机访问:选vector,尾部push_back/pop_back均摊O(1)效率。
  • • 头尾双端操作+随机访问:选deque,头尾插入/删除均为O(1)(无需移动元素,仅修改指针)。
  • • 中间频繁插入/删除+低随机访问需求:选list(双向链表),插入/删除O(1)(已定位迭代器),但访问元素需O(n)顺序遍历。

3. 已知元素数量及内存考虑

  • • 空间敏感+已知元素量:优先选vector,避免链表(list/deque)的指针额外内存开销。
  • • 大元素+高频插入删除+空间允许:可接受list的内存开销(每个节点含前驱/后继指针)。

4. 复杂场景的折中方案

  • • 输入阶段中间插入+后续随机访问
    先用list存储(灵活插入),输入完成后排序并复制到vector中(转为高效随机访问)。
  • • 随机访问+双端插入删除:选deque,平衡vector的访问效率与list的双端操作优势。

5. 其他关键注意点

  • • 避免vector中间操作:频繁中间插入/删除会导致大量元素移动,时间复杂度O(n),性能低下。
  • • deque内存管理:无固定capacity,分段动态扩展,适合元素数量不可预测的双端操作场景。
  • • list迭代器稳定性:插入/删除时仅当前节点迭代器失效,其他迭代器保持有效,适合迭代过程中修改容器。

总结表:需求场景与推荐容器

需求场景 推荐容器 核心说明
高效随机访问,尾部插入/删除 vector 连续内存,缓存友好,尾部操作均摊O(1),随机访问O(1)
头尾双端插入/删除,需随机访问 deque 双端操作O(1),分段连续内存,随机访问略逊于vector
中间频繁插入/删除,随机访问需求低 list 链表结构,插入/删除O(1)(已定位),访问元素需O(n)顺序遍历
已知元素数量,空间敏感(如嵌入式场景) vector 内存紧凑(无额外指针),适合元素数量固定或可提前reserve的场景
输入阶段中间插入,后续需随机访问 list + vector 输入阶段用list灵活插入,完成后转为vector以支持高效随机访问

本文首发于【讳疾忌医-note】公众号,未经授权,不得转载。
(加入我的知识星球,免费获取账号,解锁所有文章。)

阅读剩余
THE END