容器选择策略:vector vs deque vs list vs forward_list
stl::vector、std::deque、std::list、std::forward_list四种序列容器各自的核心数据结构和性能特征是什么?在插入/删除/随机访问/内存占用等方面应该如何选择?
回答
孤独的心
vector:动态数组,连续内存。随机访问O(1),尾插/尾删O(1)均摊,中间插入/删除O(n)。内存占用最低(仅元素+容量)。适用:随机访问频繁、主要在尾部操作。
deque:分段连续内存(block数组),双端增删O(1)均摊,随机访问O(1)(两重间接)。中间插入/删除O(n)但比vector稍好(移动元素更少)。内存占用中等(多一层块索引)。适用:双端操作,需要随机访问但主要在两端操作。
list:双向链表,每个元素独立分配(节点含前后指针)。插入/删除任意位置O(1)(已知迭代器),随机访问O(n)。内存占用高(额外两指针+分配开销)。适用:频繁中间插入删除,不需要随机访问,迭代器稳定性要求高。
forward_list:单向链表,比list省一个prev指针。只支持前向遍历。适用:节省内存,只需前向遍历,头插为主(如哈希表桶)。
实战选择:默认用vector;需要双端操作用deque;需要频繁中间插入删除且不关心随机访问用list;内存受限的单链场景用forward_list。