C++ 标准库中包含了许多优秀的组件,其中就有一组算法(algorithms)。每个算法都执行原本可以用一个编写良好的循环来完成的任务,但它们拥有明确的名称、复杂度保证以及优化实现。
因此,假设编写了如下代码:
int vals[]{ 2,3,5,7,11 };
int dest[5];
for(int i = 0; i != 5; ++i)
dest[i] = vals[i];
在 C++ 中更惯用的写法是使用标准库算法,例如这样替代:
int vals[]{ 2,3,5,7,11 };
int dest[5];
std::copy(begin(vals), end(vals), begin(dest));
C++ 中的序列采用形式 [begin, end),对于所有算法来说,起始迭代器(例如,begin(vals))是包含在内的,而结束迭代器(例如,end(vals))则是不包含在内的。这种范围称为“半开区间”(half-open range)。
<algorithm> 头文件中的所有算法,以及它的“姊妹”头文件 <numeric> 中的算法,都遵循这一简单的约定。
<ranges> 库是自 C++20 以来对 C++ 标准库的一个重大补充,有时可以用来写出比已经非常出色的 <algorithm> 库更加优雅和清晰的代码。本书中并没有大量使用 ranges,但这并不代表这个库不优秀。请随意使用它,并探索它可以帮助你提升代码质量的各种用法。它是一个非常强大且值得学习的工具。