gpt4 book ai didi

C++20 std::ranges:范围适配器跳过每个第 n 个元素

转载 作者:行者123 更新时间:2023-12-04 12:20:13 25 4
gpt4 key购买 nike

我正在努力更熟悉 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说:

Discussed by LEWG in Prague.http://wiki.edg.com/bin/view/Wg21prague/P1899

Ensure that stride is positive. Unanimous consent

Revise (many suggestions in the notes) and return to LEWG. Unanimous consent


我没有找到笔记的公开拷贝。

还有另外一个建议是在 iota_view中添加step参数对于示例案例,这将实现相同的效果: P2016 .

关于C++20 std::ranges:范围适配器跳过每个第 n 个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68172541/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com