[英]C++20 std::ranges: Range adapter to skip every nth element
我试图更加熟悉 C++20 的std::ranges
实现,但我遇到了一个看似简单的问题,如果不滚动我自己的实现,我就找不到标准解决方案。
问题很简单:我只想使用 C++20 范围适配器访问和处理范围内的每个第 N 个元素。 例如,我正在寻找具有以下功能的实用程序:
for (auto x : std::ranges::iota_view{0, 10} | std::ranges::<some api>(3)) {
std::cout << x << " ";
}
将产生如下输出:
0 3 6 9
这当然可以用std::ranges::filter
类的东西来完成——但是filter
实际上访问和处理每个值的迭代器,例如它评估表达式“ predicate(*it)
”。 对于小的简单范围,这很好,但对于更复杂/昂贵的生成器迭代器,评估*it
可能成本高昂且不可取,因为否则这些值将不被使用。
我正在寻找更类似于std::ranges::take
或std::ranges::drop
行为的东西,它只是通过迭代而不是访问它来绕过该值。
是否有一个简单的 C++20 解决方案来实现这一点? 或者我是否必须使用包装器迭代器/哨兵来推出自己的operator++
,其中operator++
完成 N 次? 这听起来像是一个应该已经成为标准一部分的实用程序,但我似乎找不到任何符合此描述的内容。
我认为标准库中没有用于此的范围适配器。
然而, Ranges-v3库确实有它:
ranges::iota_view{0, 10} | ranges::stride_view(3)
有一个建议将此类适配器添加到标准中: P1899 。
Github 问题说:
LEWG 在布拉格进行了讨论。 http://wiki.edg.com/bin/view/Wg21prague/P1899
确保步幅为正。 一致同意
修改(笔记中有很多建议)并返回给 LEWG。 一致同意
我没有找到笔记的公开副本。
还有另一个建议将 step 参数添加到iota_view
,这将在示例案例中实现相同的效果: P2016 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.