9

我正在处理 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);

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

4

1 回答 1

8

然后我会排序,就像 range-v3 对|action::sort...

不,你实际上不能这样排序rr

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

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

您可以像以前一样创建一个vectorfrom rr,然后您可以actions在该范围内使用:

ints |= ranges::actions::sort;  // ok

然而,c++20 没有actions(希望我们能在 c++23 中得到它们),所以在此之前你必须在sort没有管道语法的情况下调用算法:

std::ranges::sort(ints);  // ok
于 2020-09-28T14:02:40.413 回答