C++ 标准模板库(Standard Template Library,STL)基础详解--stl学习查询收藏这一篇就够了
1. STL概念
- STL(Standard Template Library,标准模板库)是 C++ 标准库中那套“容器 + 算法 + 迭代器”的泛称,用模板实现泛型编程。最早由 HP 的 STL 演化而来,在 C++98 被标准化。今天大家口头上常说的 STL,通常指这几块核心组件:
- 容器(Containers):存放数据的结构
- 算法(Algorithms):如 sort, find, accumulate, transform, lower_bound 等(头文件 , )
- 迭代器(Iterators):把算法与容器解耦的“指针风格”对象(输入/输出/前向/双向/随机访问 等类别)
- 函数对象/谓词(Function Objects/Predicates):比较器、定制规则(今天常用 lambda直接定制规则)
- 适配器(Adapters):容器/迭代器/函数的包装器(如 back_inserter, std::not_fn)
- 分配器(Allocator):内存分配策略(大多时候用默认的即可)
2. STL常用容器分类:
1. 顺序/序列类(Sequence)
| 容器 | 底层数据结构(实现习惯) | 主要特性/复杂度要点 |
|---|---|---|
std::array<T, N> | 固定长度连续内存 | 编译期定长;随机访问 O(1);几乎不失效(对象析构除外)。 |
std::vector<T> | 动态数组(连续内存),几何倍数扩容 | push_back 均摊 O(1);中间插/删 O(n);扩容会使所有迭代器/引用失效。 |
std::deque<T> | 分段数组(块列表 + 中央索引) | 头/尾插删 O(1);随机访问 O(1);整体不连续;在首尾操作常使迭代器失效。 |
std::list<T> | 双向链表(节点存储) | 已知位置插删/拼接 splice O(1);无随机访问;迭代器/引用稳定(删掉的那个失效)。 |
std::forward_list<T> | 单向链表 | 更轻量;只提供前向迭代;头部/已知前驱处插删 O(1);无 size()。 |
std::basic_string<charT>(std::string) | 动态数组(连续内存);多数实现有 SSO(小字符串优化) | 语义与 vector 类似(按字符);扩容规则近似;是否 SSO 非强制、但常见。 |
2. 有序关联(Ordered Associative)
| 容器 | 底层数据结构 | 主要特性/复杂度要点 |
|---|---|---|
std::set / std::multiset | 平衡二叉搜索树(通常红黑树) | 有序、去重/可重复;查找/插入/删除 O(log n);迭代器稳定(被删元素除外)。 |
std::map / std::multimap | 平衡 BST(通常红黑树) | 有序键值对;操作 O(log n);支持自定义比较器。 |
3. 无序关联(Unordered / Hash)
| 容器 | 底层数据结构 | 主要特性/复杂度要点 |
|---|---|---|
std::unordered_set / std::unordered_multiset | 哈希表:桶数组 + 链地址法(节点链表) | 平均查找/插入/删除 O(1)、最坏 O(n);rehash 会使迭代器失效(引用通常仍有效)。 |
std::unordered_map / std::unordered_multimap | 同上 | 同上;可调装载因子 max_load_factor,必要时 rehash/ reserve。 |
4. 适配器(基于其他容器的包装的容器)
| 容器适配器 | 典型底层 | 主要特性/复杂度要点 |
|---|---|---|
std::stack | 默认 deque(也可用 vector/list) | LIFO;push/pop/top O(1)(取决于底层)。 |
std::queue | 默认 deque | FIFO;push 尾/pop 头 O(1)。 |
std::priority_queue | vector 上的二叉堆(最大堆) | top O(1);push/pop O(log n);不稳定排序。 |
5. C++23 扩展
| 容器 | 底层数据结构 | 要点 |
|---|---|---|
std::flat_set / std::flat_map(以及 multi 版本) | 排序的连续存储(常见为 vector + 二分查找) | 查找 O(log n),插删 O(n);缓存友好,小/中规模数据很香。实现支持度视编译器而定。 |
3. 容器的操作
1. 通用(几乎所有容器都有)
-
begin()/end()/cbegin()/cend():迭代起止(遍历)
-
rbegin()/rend():反向迭代
-
size():元素个数
-
empty():是否为空
-
clear():清空(迭代器多失效)
-
swap(other) / std::swap(a,b):常数时间交换
-
赋值/构造:拷贝/移动构造、operator=
2. 顺序容器共通(vector/deque/list/forward_list/array/string)
元素访问
插入/构造
-
insert(pos, x) / emplace(pos, args…):在任意位置插入
-
push_back(x) / emplace_back(…):尾部插入
-
push_front(x) / emplace_front(…):头部插入(deque/list/forward_list)
-
assign(n, x) / assign(first,last):重置内容
删除/调整
-
erase(pos) / erase(first,last):删除区间
-
pop_back() / pop_front():弹出尾/头
-
resize(n):改变大小(不足补、超出截)
vector(动态数组)专属
-
capacity():容量
-
reserve(n):预留容量(减少扩容)
-
shrink_to_fit():回收冗余容量
-
注意:vector在大小达到capacity时会扩容,扩容会使迭代器/引用全部失效;随机访问 O(1)。
deque(分段数组)
注意:无 capacity/reserve;首尾插删 O(1),随机访问 O(1)。
list(双向链表)
-
splice(pos, other[, it|first,last]):常数时间拼接
-
remove(val) / remove_if(pred):删除匹配
-
unique():相邻去重
-
merge(other[, comp]):合并有序链表
-
sort([comp]) / reverse():链表内排序/反转
-
注意:迭代器稳定(被删元素除外),无随机访问。
forward_list(单链表)
-
before_begin():头前迭代器
-
insert_after(pos, x) / emplace_after(…)
-
erase_after(pos) / erase_after(first,last)
-
注意:仅前向迭代;无 size()。
array
-
fill(x):填充
-
其他如 size()/data()/front()/back() 同上
-
注意:定长,不能插删元素。
3. 有序关联容器(set/multiset/map/multimap,红黑树等)
查找/区间:
-
find(key):定位迭代器(O(log n))
-
count(key):计数(set/map 为 0/1;multi* 可>1)
-
lower_bound(key) / upper_bound(key) / equal_range(key):范围查询
-
contains(key)(C++20):是否存在
插入/删除:
- insert(x) / emplace(args…) / erase(key|it|first,last)
仅 map/multimap:
节点操作(C++17):
extract(k|it) → insert(node) / merge(other)
4. 无序关联容器(unordered_set/map 及 multi 变体,哈希表)
查找/存在性:
- find / count / contains(均摊 O(1))
插入/删除/访问:
-
insert / emplace / erase
-
operator[] / at(仅 unordered_map 系)
桶与负载因子(哈希特有):
-
bucket_count() / bucket(key) / bucket_size(i)
-
load_factor() / max_load_factor(f)
-
rehash(n) / reserve(n):控制扩容
-
注意:rehash/reserve 会让所有迭代器失效(引用通常仍有效)。
5. 容器适配器
stack
- push/emplace,pop,top,size,empty
queue
- push/emplace,pop,front,back,size,empty
priority_queue
- push/emplace(O(log n)),pop(O(log n)),top(O(1)),size,empty
6. 常见注意事项
-
map::operator[] 会插入默认值;只读请用 find/at/contains。
-
vector 中间 insert/erase 或扩容会让大量迭代器/引用失效。
-
unordered_* 的 rehash/reserve 使所有迭代器失效。
-
链表成员算法(list::splice/merge/sort/unique)是成员函数,不是 里的自由函数。
4. stl容器单讲链接
- 预留,更新后会填上文章地址
- vector:C++ 标准模板库(Standard Template Library,STL)之vector详解
- list:
- deque:
- set/multiset/unordered_set:
- map/multimap/unordered_map:
- stack/queue/priority_queue:

2万+

被折叠的 条评论
为什么被折叠?



