C++ 标准容器 STL

C++ 标准容器 STL

STL 清单

1. 序列式容器

容器头文件逻辑结构默认底层容器特点operator[]常用频率
std::vector<vector>动态数组连续内存块随机访问 O(1),尾部增删 O(1),中间插入删除 O(n),内存连续缓存友好✅ 支持(随机访问 O(1))⭐⭐⭐⭐⭐ (极高)
std::deque<deque>双端队列分段连续数组首尾增删 O(1),支持随机访问 O(1),中间插入删除 O(n),内存非完全连续✅ 支持(随机访问 O(1))⭐⭐⭐ (中等)
std::list<list>双向链表离散节点+双向指针任意位置插入删除O(1),不支持随机访问,遍历较慢,内存开销大❌ 不支持(非随机访问迭代器)⭐⭐ (较低)
std::forward_list<forward_list>单向链表离散节点+单向指针仅支持前向遍历,头部插入O(1),比list更省内存,无size()方法❌ 不支持(非随机访问迭代器)⭐ (极低)
std::array<array>固定大小数组栈上连续内存编译期确定大小,零开销抽象,支持STL接口和边界检查(at),不可动态扩容✅ 支持(随机访问 O(1))⭐⭐⭐⭐ (高)

2. 有序关联式容器

容器头文件逻辑结构默认底层容器特点operator[]常用频率
std::set<set>有序唯一集合红黑树元素自动排序且唯一,查找/插入/删除 O(log n),支持范围查询❌ 不支持(无 Key-Value 结构)⭐⭐⭐⭐ (高)
std::multiset<set>有序可重复集合红黑树允许重复元素,其余同 set,count() 返回重复次数❌ 不支持(无 Key-Value 结构)⭐⭐ (较低)
std::map<map>有序键值对映射红黑树Key 唯一且自动排序,Value 通过 Key 访问,查找/插入 O(log n)✅ 支持(按 Key 访问,不存在则插入,O(log n))⭐⭐⭐⭐⭐ (极高)
std::multimap<map>有序可重复键映射红黑树允许重复 Key,需用 equal_range() 获取所有匹配项❌ 不支持(Key 不唯一,语义不明确)⭐ (极低)

3. 无序关联式容器

容器头文件逻辑结构默认底层容器特点operator[]常用频率
std::unordered_set<unordered_set>无序唯一集合哈希表平均查找/插入 O(1),最坏 O(n),元素无序,需自定义哈希函数❌ 不支持(无 Key-Value 结构)⭐⭐⭐⭐ (高)
std::unordered_multiset<unordered_set>无序可重复集合哈希表允许重复元素,平均 O(1) 操作,无序❌ 不支持(无 Key-Value 结构)⭐ (极低)
std::unordered_map<unordered_map>无序键值对映射哈希表Key 唯一,平均查找 O(1),高频查找场景首选,无序✅ 支持(按 Key 访问,不存在则插入,平均 O(1))⭐⭐⭐⭐⭐ (极高)
std::unordered_multimap<unordered_map>无序可重复键映射哈希表允许重复 Key,平均 O(1)❌ 不支持(Key 不唯一,语义不明确)⭐ (极低)

4. 容器适配器

容器头文件逻辑结构默认底层容器特点operator[]常用频率
std::stack<stack>栈(LIFO)std::deque后进先出,仅暴露 push/pop/top,无迭代器,不可遍历❌ 不支持(仅顶部访问,无随机访问语义)⭐⭐⭐⭐ (高)
std::queue<queue>队列(FIFO)std::deque先进先出,仅暴露 push/pop/front/back,无迭代器❌ 不支持(仅首尾访问,无随机访问语义)⭐⭐⭐⭐ (高)
std::priority_queue<queue>优先队列(堆)std::vector出队始终为最大/最小元素,基于二叉堆实现,无迭代器❌ 不支持(仅顶部访问,堆结构不允许随机下标访问)⭐⭐⭐ (中等)

5. C++ 23 扁平关联容器

容器头文件逻辑结构默认底层容器特点operator[]常用频率
std::flat_set<flat_set>排序唯一集合std::vector连续内存+二分查找,缓存友好,中小数据量优于红黑树 set❌ 不支持(无 Key-Value 结构)⭐⭐ (新特性)
std::flat_multiset<flat_set>排序可重复集合std::vector同上,允许重复元素❌ 不支持(无 Key-Value 结构)⭐ (新特性)
std::flat_map<flat_map>排序键值对映射std::vector<pair>Key-Value 分离存储或配对存储,缓存命中率远高于 std::map✅ 支持(按 Key 访问,不存在则插入,O(log n))⭐⭐ (新特性)
std::flat_multimap<flat_map>排序可重复键映射std::vector<pair>同上,允许重复 Key❌ 不支持(Key 不唯一,语义不明确)⭐ (新特性)