STL 概览与设计理念
本课属于 Coddy C++ 学习旅程的“面向对象编程”单元。第 70 课,共 104 课。
标准模板库(STL)是一组基于模板的类和函数,提供了常用的数据结构和算法。STL 建立在你学过的模板概念之上,体现了一种强大的设计理念:将数据存储与数据操作分离。
STL 围绕三个相互协作的核心组件组织:
| 组件 | 用途 | 示例 |
|---|---|---|
| 容器 | 存储对象集合 | vector、map、set |
| 迭代器 | 提供对容器元素的访问 | 输入、输出、随机访问 |
| 算法 | 对数据执行操作 | sort、find、transform |
关键在于,算法并不直接了解容器,而是通过迭代器来操作。这意味着,一个 sort 算法可以用于向量、数组,以及任何提供正确迭代器类型的容器:
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
std::vector<int> nums = {5, 2, 8, 1, 9};
std::sort(nums.begin(), nums.end());
for (int n : nums) {
std::cout << n << " ";
}
// 输出:1 2 5 8 9
}这种分离意味着你可以自由组合:将任意算法与兼容的容器搭配使用,无需编写新代码。STL 提供经过实战检验且经过优化的实现,让你专注于解决问题,而不是重新实现常见的数据结构。
挑战
简单让我们构建一个简单的数据处理系统,展示 STL 将容器、迭代器和算法分离的设计理念。你将创建一个使用 STL 组件的工具模块,以及一个展示这些组件如何协同工作的主程序。
你将创建两个文件:
DataProcessor.h:定义通过迭代器处理 STL 容器的工具函数,展示 STL 的设计理念。创建一个名为
printVector的函数,接收一个std::vector<int>&,并打印所有元素,元素之间用空格分隔,最后换行。使用迭代器(begin()和end())遍历容器。创建一个名为
sortAndPrint的函数,接收一个std::vector<int>&,使用std::sort对其排序,然后打印排序后的元素,元素之间用空格分隔,最后换行。创建一个名为
findElement的函数,接收一个std::vector<int>&和一个要查找的int值。使用std::find查找该元素。如果找到,打印Found: <value>。如果没找到,打印Not found: <value>。创建一个名为
getSum的函数,接收一个std::vector<int>&,并返回所有元素的总和。你可以用迭代器编写一个简单的循环来完成这个操作。main.cpp:读取输入,并展示 STL 组件如何协同工作。读取 5 个输入(每个输入单独占一行):
- 第一个整数
- 第二个整数
- 第三个整数
- 第四个整数
- 要查找的值
创建一个
std::vector<int>,并将前四个整数添加到其中。然后通过以下操作展示 STL 的设计理念:- 打印
Original:,然后调用printVector - 打印
Sorted:,然后调用sortAndPrint - 使用要查找的值调用
findElement - 使用
getSum打印Sum: <result>
例如,输入 5、2、8、1 和 8 时:
Original: 5 2 8 1
Sorted: 1 2 5 8
Found: 8
Sum: 16输入 10、30、20、40 和 15 时:
Original: 10 30 20 40
Sorted: 10 20 30 40
Not found: 15
Sum: 100注意这些函数如何通过迭代器处理 vector,以及 std::sort 和 std::find 如何对任何提供相应迭代器类型的容器进行操作。这就是 STL 设计的强大之处:算法与容器相互独立,只通过迭代器连接。
亲手试试
#include <iostream>
#include <vector>
#include "DataProcessor.h"
using namespace std;
int main() {
// 从输入中读取 5 个整数
int num1, num2, num3, num4, searchValue;
cin >> num1;
cin >> num2;
cin >> num3;
cin >> num4;
cin >> searchValue;
// TODO: 创建一个 vector,并将前 4 个整数添加进去
// TODO: 输出 "Original: ",然后调用 printVector
// TODO: 输出 "Sorted: ",然后调用 sortAndPrint
// TODO: 将要查找的值传给 findElement 并调用它
// TODO: 输出 "Sum: ",后面跟上 getSum 的结果
return 0;
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: C++ 在线编译器