Menu
CoddyTech

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 提供经过实战检验且经过优化的实现,让你专注于解决问题,而不是重新实现常见的数据结构。

challenge icon

挑战

简单

让我们构建一个简单的数据处理系统,展示 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 个输入(每个输入单独占一行):

    1. 第一个整数
    2. 第二个整数
    3. 第三个整数
    4. 第四个整数
    5. 要查找的值

    创建一个 std::vector<int>,并将前四个整数添加到其中。然后通过以下操作展示 STL 的设计理念:

    1. 打印 Original:,然后调用 printVector
    2. 打印 Sorted:,然后调用 sortAndPrint
    3. 使用要查找的值调用 findElement
    4. 使用 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;
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: C++ 在线编译器