我正在尝试更熟悉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 次?这听起来像是一个应该已经成为标准一部分的实用程序,但我似乎找不到符合这个描述的任何内容。