STL 算法

STL 分为容器、迭代器和算法三个部分;我在第八章中简单介绍了容器和迭代器。STL 算法的部分,则是包装了在容器上的一些常见操作。

类似迭代器,STL 算法在 C++20 之后进行了一次大的改动。这使得 STL 算法分为两个版本:传统(Legacy)版本和约束(Restrained)版本:传统版本的算法定义于 std 命名空间,而约束版本的算法定义于 std::ranges 命名空间。约束算法使用起来比传统算法更容易,因此我这里就先介绍这种被称为“STLv2”的约束算法。

算法的分类

STL 算法库基本都是作用在序列上的,比如数组、std::vector 等容器。这些算法包括排序、取最值、做筛选和映射等等。

比如,排序算法 std::ranges::sort

#include <iostream>
#include <vector>
#include <algorithm> // 算法库大多定义于此

// 为了简便,将 rg 作为命名空间 std::ranges 的别名
// 这样,rg::xyz 就是 std::ranges::xyz 的别名
namespace rg = std::ranges;

int main() {
    std::vector a{4, 1, 6, 2};
    rg::sort(a);
    for (auto i : a) {
        std::cout << i << ' ';
    }
}

这段代码会将容器 a 中的元素从小到大排序;最终输出的就是 1 2 4 6。又比如最值算法 std::ranges::max

#include <iostream>
#include <algorithm> // 算法库大多定义于此
namespace rg = std::ranges;

int main() {
    int a[]{4, 1, 6, 2};
    std::cout << rg::max(a) << std::endl;
}

这样的代码会输出 a 中的最大元素值。

接下来,我们先从实践出发,讲讲最常用的算法—— sort

最近更新:
代码未运行