C++ STL 常用容器入门
STL(Standard Template Library)是 C++ 标准库的核心组成部分,提供了多种高效的数据结构。对于初学者来说,理解不同容器的适用场景和底层机制至关重要。本文将重点讲解 vector、pair、string、队列、栈以及各类集合与映射容器。
vector:动态数组
vector 是最常用的变长数组。它的底层实现采用了'倍增思想':当空间不足时,系统会重新分配更大的内存(通常是原容量的两倍),并将旧数据拷贝过去。这种策略虽然涉及内存拷贝,但能显著减少频繁申请小空间的开销。简单来说,申请一次大空间比申请一千次小空间要快得多。
注意:vector 支持字典序比较运算,可以直接用于排序。
常用操作
size(): 获取元素个数。empty(): 判断是否为空。clear(): 清空内容。push_back()/pop_back(): 尾部增删。front()/back(): 访问首尾元素。begin()/end(): 迭代器遍历。[]: 下标访问。
pair:二元组
pair 可以看作包含两个变量的结构体,常用于存储键值对或需要同时处理两个属性的场景。
- 定义:
pair<int, int> p; - 排序: 默认按字典序,优先比较
first,若相同再比较second。 - 嵌套: 如需更多属性,可嵌套使用,如
pair<int, pair<int, int>>。
string:字符串封装
C++ 将字符串进行了对象化封装,方便操作。
size()/length(): 获取长度。substr(起始,长度): 截取子串。c_str(): 获取 C 风格字符串指针。
序列容器:队列、栈、双端队列
queue & priority_queue
queue 遵循先进先出(FIFO)。priority_queue 基于堆实现,默认为大根堆。
- 构造小根堆: 可使用
greater<int>作为比较函数,或在 push 时插入负值。 - 常用函数:
push(),top(),pop()。
stack
栈遵循后进先出(LIFO)。
- 常用函数:
push(),top(),pop()。
deque
双端队列,功能类似加强版 vector,支持两端插入删除。由于性能开销较大,日常使用频率略低于 vector。
关联容器:Set 与 Map
set / multiset
基于红黑树实现,自动维护有序序列。
- 特点:
set不允许重复元素,multiset允许。 - 复杂度: 大部分操作为 O(log n)。
- 查找:
lower_bound()返回大于等于 x 的最小迭代器,upper_bound()返回大于 x 的最小迭代器。
map / multimap
存储键值对,同样基于平衡二叉树。
- 注意:
multimap不支持直接通过[]修改值(因为可能对应多个 key)。 - 操作:
insert(),find(),erase(),lower_bound()。
哈希表容器
unordered_set / unordered_map 系列
这些容器基于哈希表实现,内部无序。
- 优势: 增删改查平均时间复杂度为 O(1)。
- 限制: 不支持
lower_bound()及迭代器的自增/自减操作。
参考总结
以下整理了一份常见的 STL 容器速查表,供日常开发查阅:
// vector: 变长数组,倍增思想
size(), empty(), clear(), front()/back(), push_back()/pop_back(), begin()/end(), []
// pair: 二元组
first, second (字典序比较)
// string: 字符串
size(), length(), empty(), clear(), substr(), c_str()
// queue: 队列
size(), empty(), push(), front(), back(), pop()
// priority_queue: 优先队列 (默认大根堆)
size(), empty(), push(), top(), pop()
// 小根堆示例:priority_queue<int, vector<int>, greater<int>> q;
// stack: 栈
size(), empty(), push(), top(), pop()
// deque: 双端队列
size(), empty(), clear(), front()/back(), push_back()/pop_back(), push_front()/pop_front(), begin()/end(), []
// set, map, multiset, multimap: 基于红黑树
size(), empty(), clear(), begin()/end(), ++/-- (O(logn))
insert(), find(), count(), erase(), lower_bound()/upper_bound()
// unordered_set, unordered_map 系列: 哈希表
增删改查 O(1),不支持 lower_bound/upper_bound 及迭代器自增自减

