C++20中views的学习和使用
如你所知,C++标准库从C++98发布以来在机制层面一直没有较大变动。直到C++20中range的引入,再次使得沉寂许久的C++标准库再次焕发了生机。
range 库主要作用于对具有范围的数据处理。对于确定范围的数据,在传统标准库中也有对应的处理方案。但 range 对范围的定义和传统的定义并不一致,如范围具有不要求一定有界,不要求首尾的数据类型一致等等,这是背后其实有一套复杂的规则。
而从应用的角度来看,我们应该熟悉和掌握 range 中的常用函数和数据类型,其中最常用的一类 range 便是 view,这在命名空间 std::ranges::views 中。
下面的代码实例为计算一个 vector 中的每个元素的平方。熟悉传统容器和算法库使用的朋友们很容易能够学习并使用。
#include <algorithm> #include <iostream> #include <ranges> #include <vector> int square(int x) { return x * x; } int main() { std::vector data = {1, 2, 3, 4, 5}; // 使用传统的算法库 { std::vector<int> ret; std::transform(data.begin(), data.end(), std::back_inserter(ret), square); for (auto&& x : ret) { std::cout << x << " "; } std::cout << std::endl; } // 使用 C++20 的 view { auto ret = std::ranges::views::transform(data, square); for (auto&& x : ret) { std::cout << x << " "; } std::cout << std::endl; } }对于这段代码,最直观的感受可能是使用 view 可以少写一些代码。但这些不会成为 view 引入新标准的原因。
