C ++ 20范围和排序

问题描述

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

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

解决方法

然后我将进行排序,就像range-v3对|action::sort所做的一样...

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

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

因为rrview。尽管view可以提供对基础范围的可变访问,但sort还需要该范围来支持随机访问。像view这样的延迟生成的rr不允许这样做。

您可以按照完成的操作从vector创建一个rr,然后可以在该范围内使用actions

ints |= ranges::actions::sort;  // ok
但是,

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

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