如何连接两个现有范围::视图?

nik*_*ack 5 c++ c++11 range-v3

我想使用现有视图进行串联。在代码中:

auto rng = view::empty<vector<int>>();

for(int i{0}; i < 5; ++i)
{
    vector<int> const & v{foo()}; // returns a reference
    rng |= view::concat(v); // doesn't compile - error: no viable overloaded '|='
};
Run Code Online (Sandbox Code Playgroud)

换句话说 - 如何创建多个向量的视图,其数量直到运行时才知道?

Eri*_*ler 8

您不能以这种方式组合视图。连接视图会产生不同类型的对象。您无法将其分配回原始视图,因为它的类型不同。

您可以通过组合view::cycle(采用一个范围并无限重复)和(采用范围的view::takeN​​个元素)来获得所需的效果。

vector<int> const & v{foo()}; // returns a reference
auto rng = v | view::cycle | view::take(5 * v.size());
Run Code Online (Sandbox Code Playgroud)

编辑

如果foo()每次都可以返回对不同向量的引用,那么除了 之外,您还可以使用view::generate和:view::joinview::take

auto rng = view::generate(foo) | view::take(5) | view::join;
Run Code Online (Sandbox Code Playgroud)