概述
本文讲解 C++ STL 中的常用容器,包括 vector、string、queue、priority_queue、stack、deque、set、map 及其无序版本。
vector
倍增思想:系统分配内存的时间主要取决于申请次数而非空间大小。因此,变长数组应尽量减少重新分配的次数。当空间不足时,通常将容量翻倍(*2)再次申请。
vector 支持比较运算,按字典序大小排序比较。
pair
存储二元组,类似包含两个变量的结构体。支持比较运算,排序时按字典序,以 first 为第一关键字,second 为第二关键字。适用于存储具有两种不同属性的数据。若有三个属性,可使用嵌套 pair,如 pair<int, pair<int, int>>。
string
C++ 对字符串进行了封装,提供丰富的操作函数。
queue / priority_queue / stack
- queue (队列):先进先出。
- priority_queue (优先队列):默认是大根堆。构造小根堆方式:定义时指定比较器
greater<int>或在 push 时插入负值。 - stack (栈):后进先出。
deque
双端队列,功能强大,支持两端插入删除。相比 vector 在某些场景下开销略大,使用频率稍低。
set / map
基于平衡二叉树(红黑树),动态维护有序序列。操作时间复杂度为 O(log n)。
- set/multiset:set 不能包含重复元素,multiset 可以。
- map/multimap:键值对存储。
unordered_set / unordered_map
基于哈希表。增删改查复杂度为 O(1),但不支持 lower_bound 及迭代器自增/自减操作。
常用接口参考
// Vector
size() // 返回元素个数
empty() // 返回是否为空
clear() // 清空
front()/back()
push_back()/pop_back()
begin()/end()
[] // 支持比较运算,按字典序
// Pair
pair<int, int>
first, second // 第一个元素,第二个元素
// 支持比较运算,以 first 为第一关键字,以 second 为第二关键字(字典序)
// String
size()/()
()
()
(起始下标,子串长度)
()
()
()
()
()
()
()
()
()
()
()
()
()
()
()
()
()
()
()
()
()/()
()/()
()/()
()/()
[]
()
()
()
()/()
++, --
()
()
()
()
()/()


