C++20 std::ranges: Range adapter to skip every nth element(C++20 std::Range:每隔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实际上访问和处理每个值的迭代器,例如它计算表达式&[2-2]>&来实现。对于小的简单范围,这很好,但对于更复杂/更昂贵的生成器迭代器,则计算*it可能代价高昂且不受欢迎,因为否则这些值将不会被使用。
我正在寻找与std::ranges::take或std::ranges::drop的行为更等价的值,它们只是通过迭代来绕过该值,而不是访问它。
有没有简单的C++20解决方案来实现这一点?或者我必须使用一个包装器迭代器/哨兵来执行自己的代码,其中operator++被执行了N次?这听起来像是应该是标准的一部分,但我似乎找不到任何符合此描述的实用程序。
推荐答案
我认为标准库中没有针对此的范围适配器。
Ranges-v3库确实有:
ranges::iota_view{0, 10} | ranges::stride_view(3)
建议将此类适配器添加到标准中:P1899。
GithubIssue表示:
由工作组在布拉格讨论。 http://wiki.edg.com/bin/view/Wg21prague/P1899
确保Stride为正数。一致同意
修改(笔记中的许多建议)并返回LEWG。一致同意
我没有找到笔记的公共副本。
还有另一项建议,即在iota_view中添加步骤参数,以实现相同的示例:P2016。
这篇关于C++20 std::Range:每隔n个元素跳过的范围适配器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:C++20 std::Range:每隔n个元素跳过的范围适配器
基础教程推荐
- 我应该对 C++ 中的成员变量和函数参数使用相同的名称吗? 2021-01-01
- GDB 显示调用堆栈上函数地址的当前编译二进制文 2022-09-05
- 通过引用传递 C++ 迭代器有什么问题? 2022-01-01
- 非静态 const 成员,不能使用默认赋值运算符 2022-10-09
- 为什么派生模板类不能访问基模板类的标识符? 2021-01-01
- 为什么 RegOpenKeyEx() 在 Vista 64 位上返回错误代码 2021-01-01
- 如果我为无符号变量分配负值会发生什么? 2022-01-01
- 为什么 typeid.name() 使用 GCC 返回奇怪的字符以及如 2022-09-16
- 初始化列表*参数*评估顺序 2021-01-01
- CString 到 char* 2021-01-01
