使用惰性范围组合器,例如 ranges::view::reverse
我可以为它提供一个参数(例如 reverse(iota(0,3))
);或者我可以使用它来调整使用 operator|
的范围(例如 iota(0,3) | reverse
)。这种奇偶校验看起来很正常;以下是无效、一元和二元 View 的示例:
#include <range/v3/all.hpp>
#include <iostream>
int main(int argc, char *argv[])
{
using namespace ranges::view;
std::cout << (iota(0,9) | reverse) << ' ';
std::cout << reverse(iota(0,9)) << '\n';
std::cout << (iota(0,9) | chunk(4)) << ' ';
std::cout << chunk(iota(0,9),4) << '\n';
std::cout << (iota(0,9) | replace(5,0)) << ' ';
std::cout << replace(iota(0,9),5,0) << '\n';
return 0;
}
我注意到 ranges::view::zip_with
组合器只能用于第二种(非适配器)形式;例如 zip_with(std::plus{},iota(0,9),iota(0,9))
。是否有技术原因导致 zip_with
无法定义为与 operator|
一起使用? ranges-v3 库中惰性范围组合子的参数是否有规范的排序?
我正在使用 ranges-v3 库的最新版本 (v0.4.0)。
最佳答案
r | 在 range-v3 中是一个很常见的约定adapter(x)
与 adapter(r, x)
意思相同。 (事实上什至还有一种编程语言 Elixir,r |> adapter(x)
实际上直接计算为 adapter(r, x)
。
zip_with
的问题在于,正如您指出的那样,用法是:
zip_with(std::plus{},iota(0,9),iota(0,9))
这意味着与 operator|
的逻辑分离将是:
std::plus{} | zip_with(iota(0,9),iota(0,9))
但是,那不是左侧的范围。那是一些二元运算符。 range-v3 就是关于链接范围。在所有其他情况下,它是显示在 |
左侧的范围。因此,虽然这在技术上并不难做到,但它似乎是一种截然不同的事情。
关于C++20 range-v3 和 zip_with View 适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55399887/