C++20范围和排序 [英] C++20 ranges and sorting

查看:32
本文介绍了C++20范围和排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在处理C++20的最后四大特性,试图学习新的主要特性。 试着从网络上下载一些与范围相关的代码,我写道:

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还需要该范围来支持随机访问。延迟生成的viewLikerr不允许这样。

您可以像您所做的那样从rr创建vector,然后可以对该范围使用actions

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

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

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

这篇关于C++20范围和排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆