如何解决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
因为rr
是view
。尽管view
可以提供对基础范围的可变访问,但sort
还需要该范围来支持随机访问。像view
这样的延迟生成的rr
不允许这样做。
您可以按照完成的操作从vector
创建一个rr
,然后可以在该范围内使用actions
:
ints |= ranges::actions::sort; // ok
但是, c ++ 20没有任何actions
(希望我们能在c ++ 23中得到它们),因此在此之前,您必须调用算法sort
没有管道语法:
std::ranges::sort(ints); // ok
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。