c++ - 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
or的行为更等效的东西std::ranges::drop
,它只是通过迭代它来绕过该值,而不是访问它。
是否有一个简单的 C++20 解决方案来完成此任务?或者我是否必须使用包装迭代器/哨兵来滚动自己的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。
推荐阅读
- php - FPDF 无法显示日文单词
- c# - WebBrowser 没有正确显示页面
- php - 如何在 Laravel 中打印与其类别名称相关的品牌名称?
- hyperledger-fabric - 我如何访问fabric ca server REST API
- jquery - 使用媒体查询或创建 JQuery 函数来添加少量 CSS 会更好吗?
- windows - 将一个变量设置为另一个变量的内容
- ffmpeg - 在 MPEG DASH MANIFEST 中指定曲目标题或语言
- mysql - MySQLSelect 语句
- laravel - 使用 foreach 在 laravel 中进行大规模更新
- amazon-web-services - 使用无服务器框架的 lambda AWS 中的授权代码授予