如何解决C++20 std::ranges:范围适配器跳过每个第 n 个元素
我正在尝试更多地了解 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++
完成 N 次?这听起来像是应该已经成为标准一部分的实用程序,但我似乎找不到任何符合此描述的内容。
解决方法
我认为标准库中没有针对此的范围适配器。
Ranges-v3 库确实有它:
ranges::iota_view{0,10} | ranges::stride_view(3)
有人提议将此类适配器添加到标准中:P1899。
Github Issue 说:
由布拉格的 LEWG 讨论。 http://wiki.edg.com/bin/view/Wg21prague/P1899
确保步幅为正。一致同意
修改(笔记中有很多建议)并返回给 LEWG。一致同意
我没有找到笔记的公开副本。
还有另一个建议是将 step 参数添加到 iota_view
中,这对于示例案例可以实现相同的效果:P2016。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。