STL 是什么:标准模板库总览
这是什么:STL(Standard Template Library,标准模板库)——C++ 自带的官方工具箱,容器、算法、迭代器三件套全在里面,写 C++ 十有八九天天在用它。
为什么用:学完 C++ 基础,你已经会写循环、函数和类了。但"会写"和"好写"是两回事——想装一串成绩,难道每次都手写链表?想排序,难道每次都手搓一遍排序算法?不用 STL,这些轮子你得一遍遍重造。
如何用:先看清容器、算法、迭代器怎么分工,再用一个 vector 加 sort 的小程序一次看全三件套。
三件套:容器、算法、迭代器
STL 的核心是三件套,分工明确:
| 成员 | 干什么 | 类比 | 常见例子 |
|---|---|---|---|
| 容器(Container) | 存数据:动态数组、键值对、集合 | 保鲜盒 | vector、map、set、string |
| 算法(Algorithm) | 加工数据:排序、查找、计数 | 菜谱 | sort、find、count |
| 迭代器(Iterator) | 在容器里定位,给算法指路 | 夹子 | begin()、end() |
一句话串起来:容器装菜,迭代器夹住菜,算法照菜谱加工。三者各管各的、自由组合,所以一套排序算法能给所有容器用。
为什么用 STL:别重复造轮子
自己手写一个链表,插入、删除、内存释放全要操心,一百行下来还可能藏着 bug;用 STL 的现成容器,一行声明搞定,而且经过几十年全球开发者的检验,比手写的稳得多。手写链表是练基本功,实际写项目,先想 STL。
STL 带来的三大好处
- 少写代码:自己写动态数组要几十行,
vector一行搞定 - 更少 bug:经过全球开发者检验,边界情况(空容器、越界)都考虑过了
- 性能更好:STL 容器和算法经过多年优化,内存使用和时间复杂度都很优秀
先睹为快
用 STL 排个序,三件套一次看全:
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> scores = {88, 72, 95, 60}; // 容器:装数据
std::sort(scores.begin(), scores.end()); // 算法:排序
for (int s : scores) { // 迭代器在暗中指路
std::cout << s << " ";
}
std::cout << std::endl;
return 0;
}
你会看到:
60 72 88 95
begin() 和 end() 就是迭代器——标出"从哪排到哪"的一对夹子。小小三行,容器、算法、迭代器全员到齐。
和 Python 对照
学过 Python 的列表与字典?那 STL 的思路你已经会了一半:
| 需求 | Python | C++ STL | 头文件 |
|---|---|---|---|
| 动态数组 | list |
std::vector |
<vector> |
| 键值对 | dict |
std::map |
<map> |
| 去重集合 | set |
std::set |
<set> |
| 字符串 | str |
std::string |
<string> |
| 排序 | sorted() |
std::sort() |
<algorithm> |
| 查找 | in / .index() |
std::find() |
<algorithm> |
最大的差别:Python 把这些都内置了,STL 得先 #include 对应头文件,再带上 std:: 前缀。麻烦一点点,换来的是对内存的精打细算。
常用头文件速查
| 功能 | 头文件 | 常见内容 |
|---|---|---|
| 动态数组 | <vector> |
std::vector |
| 键值对 | <map> |
std::map |
| 去重集合 | <set> |
std::set |
| 字符串 | <string> |
std::string |
| 排序/查找 | <algorithm> |
std::sort、std::find |
| 输入输出 | <iostream> |
std::cin、std::cout |
记忆口诀
容器装数据,算法来加工,迭代器当桥,三件套齐活。
动手改
- 把示例里的成绩换成你最近一次考试的 5 科分数,排序后打印
- 删掉
std::sort那一行再运行,看看输出顺序变成了什么样 - 试着改成从大到小:加一行
#include <functional>,把 sort 写成std::sort(scores.begin(), scores.end(), std::greater<int>()) - 把
vector<int>换成vector<double>,装入小数成绩再排序
下一章:vector,从最常用的容器开始 🐸