847 字
2 分钟
【CPP】STL
概述
STL(Standard Template Library)是 C++ 标准库中基于模板的容器、迭代器、算法、仿函数、适配器、空间配置器的集合。
- 高复用:同一套组件适配多种类型。
- 高性能:如
vector连续内存、sort优化实现。 - 可移植:符合标准的编译器均提供。
六大组件
| 组件 | 作用 |
|---|---|
| 容器 | 存储数据 |
| 迭代器 | 泛化指针,统一访问接口 |
| 算法 | 操作区间内元素 |
| 仿函数 | 可调用对象,定制算法行为 |
| 适配器 | 改造容器/迭代器/仿函数接口 |
| 空间配置器 | 内存分配与对象构造析构(对使用者多透明) |
迭代器
广义指针:可解引用、可前进,使算法与容器解耦。
每个容器定义 iterator / const_iterator,以及 C++11 起的 cbegin() 等。
五类迭代器(由弱到强)
| 类别 | 能力 | 典型容器 |
|---|---|---|
| 输入 (Input) | 读、单遍 | istream_iterator |
| 输出 (Output) | 写、单遍 | ostream_iterator |
| 前向 (Forward) | 读/写、多遍 | forward_list |
| 双向 (Bidirectional) | 前进 + 后退 | list, set, map |
| 随机访问 (Random Access) | + - []、常数距离 | vector, deque |
算法对迭代器有最低要求(如 sort 需随机访问)。
序列式容器
vector
- 动态数组,连续内存。
- 典型实现:
_start、_finish、_end_of_storage三指针。 - 尾部
push_back均摊 O(1);中间插入/删除 O(n)。 - 扩容:新容量常为 1.5 或 2 倍(实现相关);扩容后所有迭代器、指针、引用失效。
std::vector<int> v = {1, 2, 3};v.reserve(100); // 只扩容量,不改变 sizev.push_back(4);v.shrink_to_fit(); // 请求归还多余容量(非强制)list
- 双向链表,非连续;任意位置插入/删除 O(1),无随机访问。
- 成员:
sort()、merge()、unique()、splice()。 - 不能用标准
sort(需随机访问迭代器),用list::sort。
deque
- 分段连续缓冲区 + 中控 map;头尾插入 O(1),随机访问略慢于
vector。 - 无
capacity()/reserve()。
关联式容器
底层多为红黑树(平衡二叉搜索树),有序,查找 O(log n)。
| 容器 | 键 | 值 | 重复键 |
|---|---|---|---|
set | = 值 | — | 否 |
multiset | = 值 | — | 是 |
map | pair<const K, V> | 映射 | 否 |
multimap | 同上 | 映射 | 是 |
std::map<std::string, int> scores;scores["alice"] = 90;
std::set<int> s = {3, 1, 2}; // 自动排序去重(set 内唯一)自定义类型作键需提供严格弱序比较(或 C++20 透明比较 / 自定义哈希用于 unordered_*)。
无序关联容器(补充)
unordered_map / unordered_set:哈希表,平均 O(1) 查找,无序。
容器适配器
| 适配器 | 默认底层 | 特点 |
|---|---|---|
stack | deque | 栈顶操作,无迭代器 |
queue | deque | 队头队尾 |
priority_queue | vector + 堆 | 堆顶最值 |
std::stack<int> st;st.push(1);st.top();算法
通过迭代器区间 [first, last) 操作,与容器分离。
- 质变:修改区间内容 —
copy,fill,sort,remove,transform… - 非质变:只读 —
find,count,for_each(若仿函数写元素则例外)
std::vector<int> v = {3, 1, 4, 1, 5};std::sort(v.begin(), v.end());auto it = std::find(v.begin(), v.end(), 4);仿函数(函数对象)
重载 operator() 的类型,可带状态:
struct Greater { bool operator()(int a, int b) const { return a > b; }};std::sort(v.begin(), v.end(), Greater{});// 或 std::sort(v.begin(), v.end(), std::greater<int>{});谓词:返回 bool 的仿函数,如 std::less、std::equal_to。
内建仿函数:plus, minus, multiplies, less, logical_and 等。
适配器
stack/queue/priority_queue:容器适配器。reverse_iterator、insert_iterator:迭代器适配器。bind1st/bind2nd(C++11 前常用,现多被 lambda 与std::bind替代)。
容器选择策略
| 需求 | 推荐 |
|---|---|
| 随机访问、尾部增删多 | vector |
| 中间频繁插入删除、不需随机访问 | list |
| 头尾频繁操作 | deque |
| 有序、去重、只关心键 | set |
| 键值映射 | map |
| 只需快速查找、不关心顺序 | unordered_map / unordered_set |
| LIFO / FIFO | stack / queue |
C++11 相关(与 STL 配合)
auto、nullptr、范围 for:for (auto& x : v)- Lambda:
std::sort(v.begin(), v.end(), [](int a, int b){ return a > b; }); - 移动语义:
push_back(std::move(x))减少拷贝
分享
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时
相关文章 智能推荐
