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
。