如何连接两个现有的ranges::view?
How to concat two existing ranges::view?
我想使用现有视图进行串联。在代码中:
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 '|='
};
换句话说 - 我如何创建多个向量的视图,这些向量的数量直到运行时才知道?
您不能以这种方式组合视图。连接一个视图会产生一个不同类型的对象。您不能将其分配回原始视图,因为它的类型不同。
您可以通过组合 view::cycle
(获取一个范围并无限重复)和 view::take
(获取第一个 N 一个范围的元素)。
vector<int> const & v{foo()}; // returns a reference
auto rng = v | view::cycle | view::take(5 * v.size());
编辑
如果foo()
每次都可以return引用不同的vector,那么除了view::take
之外,你还可以使用view::generate
和view::join
:
auto rng = view::generate(foo) | view::take(5) | view::join;
我想使用现有视图进行串联。在代码中:
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 '|='
};
换句话说 - 我如何创建多个向量的视图,这些向量的数量直到运行时才知道?
您不能以这种方式组合视图。连接一个视图会产生一个不同类型的对象。您不能将其分配回原始视图,因为它的类型不同。
您可以通过组合 view::cycle
(获取一个范围并无限重复)和 view::take
(获取第一个 N 一个范围的元素)。
vector<int> const & v{foo()}; // returns a reference
auto rng = v | view::cycle | view::take(5 * v.size());
编辑
如果foo()
每次都可以return引用不同的vector,那么除了view::take
之外,你还可以使用view::generate
和view::join
:
auto rng = view::generate(foo) | view::take(5) | view::join;