目录
一、什么是 STL?
二、STL 三大核心组成
三、容器(Containers)
1. 顺序容器(Sequential Containers)
2. 关联容器(Associative Containers)— 基于红黑树
3. 无序容器(Unordered Containers)— 基于哈希表
⚙️ 四、算法(Algorithms)
五、迭代器(Iterators)
️ 六、STL 配合泛型编程的威力
七、STL 使用图解结构
定义:
STL(Standard Template Library) 是 C++ 标准库的一部分,它是一套使用模板技术实现的通用 数据结构和算法库。
可以理解为:
“一个高度模块化、高性能、高度泛型的编程工具箱。”
它实现了大量经典数据结构(如:数组、链表、栈、队列、哈希表、平衡树等)和常用算法(如:排序、查找、复制、替换等)。
STL 是由三大部分构成的:
组件 | 作用 | 举例 |
---|---|---|
容器(Containers) | 用来存放数据 | vector , list , map |
算法(Algorithms) | 操作容器里的数据 | sort , find , count |
迭代器(Iterators) | 用来遍历容器 | it = v.begin(); ++it |
这三者可以组合使用,例如对 vector
排序就用:std::sort(v.begin(), v.end());
容器是用来装数据的,就像一个个不同的容器:桶、箱子、抽屉……
STL 容器分为几类:
容器 | 特点 | 适用场景 |
---|---|---|
vector |
动态数组 | 最常用,支持随机访问 |
list |
双向链表 | 插入/删除快,但不能随机访问 |
deque |
双端队列 | 两端插入删除都快 |
array |
固定长度数组(C++11) | 更安全的静态数组 |
容器 | 特点 |
---|---|
set |
只存 key,自动排序 |
map |
键值对,自动排序 |
multiset / multimap |
允许重复 key |
容器 | 特点 |
---|---|
unordered_set |
哈希集合,查找快,不排序 |
unordered_map |
哈希表,键值对查找快 |
unordered_multimap |
哈希多键 |
STL 提供了 70 多个算法,可以对容器中的数据进行操作:
常用算法分类:
类型 | 代表函数 | 说明 |
---|---|---|
排序类 | sort , stable_sort |
快速排序 |
查找类 | find , binary_search |
顺序查找 / 二分查找 |
修改类 | reverse , replace , fill |
数据修改 |
统计类 | count , accumulate |
个数、和等 |
变换类 | transform , copy , remove_if |
创建新数据 |
示例:
std::vector v = {1, 5, 2, 4};
std::sort(v.begin(), v.end()); // 排序
std::reverse(v.begin(), v.end()); // 逆序
int sum = std::accumulate(v.begin(), v.end(), 0); // 求和
迭代器就像指针,用来访问容器的元素。
常见类型:
类型 | 用法 |
---|---|
begin() / end() |
遍历容器开头到结尾 |
rbegin() / rend() |
反向遍历 |
const_iterator |
只读迭代器 |
auto |
自动类型推导(推荐) |
std::vector v = {1, 2, 3};
for (std::vector::iterator it = v.begin(); it != v.end(); ++it) {
std::cout << *it << " ";
}
或者使用现代写法:
for (auto x : v) {
std::cout << x << " ";
}
STL 之所以强大,是因为它用的是 模板(template)技术,容器和算法都可以作用于任何类型的数据。
比如:
std::vector names;
std::map> data;
+-----------------------+
| STL 总结构 |
+-----------------------+
/ | \
/ | \
容器 (vector/map) 算法 (sort/find) 迭代器 (*it)
容器储存数据 ➜ 算法操作数据 ➜ 迭代器在二者之间做“桥梁”