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