我正在处理 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
because rr
is a view
. While view
s 可以提供对底层范围的可变访问,sort
另外需要范围来支持随机访问。惰性生成的view
like rr
不允许这样做。
您可以创建一个vector
from rr
正如你所做的那样,然后你可以使用actions
在该范围内:
ints |= ranges::actions::sort; // ok
然而,c++20 没有任何actions
(希望我们能在 c++23 中得到它们),所以在那之前你必须调用算法sort
没有管道语法:
std::ranges::sort(ints); // ok
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)