C++20 范围和排序

C++20 ranges and sorting

我正在处理 C++ 20 的最后 4 大功能,试图学习新的主要功能。 从网络上尝试一些与范围相关的代码,我写道:

std::vector ints{ 6, 5, 2, 8 };
auto even = [](int i) {
    return 0 == i % 2;
};

// ranges...
auto rr = ints | std::views::filter(even) 
               | std::views::transform([](auto i) {
                   return i * i;
                 })
               | std::views::reverse;

然后我会排序,就像 range-v3 对 |action::sort 所做的那样,但我知道这个实现是不一样的。

我找到的排序方式是:

ints = std::vector(std::ranges::begin(rr), std::ranges::end(rr));
std::ranges::sort(ints);

我错了吗?有人知道如何使用管道样式对视图进行排序吗?

Then I would sort, like range-v3 does with |action::sort ...

不,您实际上不能像这样对 rr 进行排序:

rr |= ranges::actions::sort; // error

因为rr是一个view。虽然 views 可以提供对底层范围的可变访问,但 sort 还需要范围来支持随机访问。像 rr 这样延迟生成的 view 不允许这样做。

您可以像之前那样从 rr 创建一个 vector,然后您可以在该范围内使用 actions

ints |= ranges::actions::sort;  // ok
然而,

c++20 没有任何 actions(希望我们能在 c++23 中得到它们),所以在那之前你必须调用算法 sort 没有管道语法:

std::ranges::sort(ints);  // ok