我正在尝试更熟悉 C++20std::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 https://en.cppreference.com/w/cpp/ranges/filter_view- 然而filter
实际上访问并处理每个值的迭代器,例如它评估表达式“predicate(*it)
“。对于小的简单范围,这很好,但对于更复杂/昂贵的生成器迭代器,然后评估*it
可能成本高昂且不受欢迎,因为否则这些值将不会被使用。
我正在寻找更等同于行为的东西std::ranges::take https://en.cppreference.com/w/cpp/ranges/take_view or std::ranges::drop https://en.cppreference.com/w/cpp/ranges/drop_view,它只是通过迭代来绕过该值,而不是访问它。
是否有一个简单的 C++20 解决方案可以完成此任务?或者我是否必须使用包装迭代器/哨兵来滚动自己的位置operator++
已经做了N次了?这听起来像是一个应该已经成为标准一部分的实用程序,但我似乎找不到任何符合此描述的内容。
我认为标准库中没有为此提供范围适配器。
范围-v3 https://github.com/ericniebler/range-v3/blob/master/include/range/v3/view/stride.hpp然而图书馆确实有它:
ranges::iota_view{0, 10} | ranges::stride_view(3)
有人建议将此类适配器添加到标准中:P1899 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1899r0.pdf.
Github Issue https://github.com/cplusplus/papers/issues/647#issuecomment-586273013 says:
LEWG 在布拉格进行了讨论。http://wiki.edg.com/bin/view/Wg21prague/P1899 http://wiki.edg.com/bin/view/Wg21prague/P1899
确保步幅为正。一致同意
修改(注释中的许多建议)并返回 LEWG。一致同意
我没有找到笔记的公开副本。
还有另一个建议添加步骤参数iota_view
对于示例情况,这将实现相同的效果:P2016 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p2016r0.pdf.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)