Range-v3视图组合和视图计算并行化
以下示例取自 range-v3 文档,演示了一个简单的views流水线组合以生成一个range:
std::vector<int> const vi{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
using namespace ranges;
auto rng = vi | views::remove_if([](int i){return i % 2 == 1;})
| views::transform([](int i){return std::to_string(i);});
我知道这views::foo相当于类似的东西foo_view(),因此上面的例子最终是这样的:
transform_view(remove_if_view(vi, <lambda>), <lambda>)
现在的问题是:
remove_if和transform操作的顺序如何?(我知道他们是懒惰的,他们实际上并没有在这一步计算,而不是在实现时计算rng,但这不是重点)。
我可以在这里看到两个选项:
-
这些操作由 range-v3融合,当
rng通过某个迭代器访问给定元素时,这两个操作因此应用于该元素。 -
当请求给定的元素时,整个
remove_if操作将贯穿始终vi,然后该操作的输出向量被送入transform。因此,我们最终得到了一个完整的“ trasformed + removed_if ”向量,它使我们能够访问所需的元素。
我很确定选项 (1) 是实际发生的事情。如果是这种情况,range-v3 是如何实现的?它是否具有某种通用组合代码以组合无限数量的组合视图操作?
附带问题:range-v3 视图公开什么样的迭代器?我认为random-access迭代器下面的任何内容都会使并行化变得不可能。
元问题:如果选项(1)是事实,那么range-algorithms考虑到它们将一个简单的范围(由多个视图组成,通过操作融合按需计算)作为输入,并行化不是非常简单吗?