我需要串联boost::iterator_range
的多个实例。
我最初的想法是使用boost::join
,但看起来它仅需要两个范围作为参数。
在另一个问题上,我发现投票最多的答案是“恩,再打一次join”,但这在我的情况下不起作用。
我意识到原因可能是我在编译时不知道我要加入的范围的确切数目,导致boost::join
不知道其返回类型。
为了更清楚一点,我需要在有范围的for循环中使用它,例如:
SomeRangeType result;
for ( const auto& a_range : some_list_of_ranges )
{
result = boost::join( result, a_range );
}
return result;
boost
中是否存在另一种类似于联接的操作?
答案 0 :(得分:2)
range-v3具有concat
和join
视图,看来您想在此处加入视图:
std::vector<std::vector<int>> v{{1, 2, 3}, {4}, {5, 6}};
for (auto e : v | ranges::view::join) {
std::cout << e << " "; // 1 2 3 4 5 6
}
答案 1 :(得分:1)
C ++没有运行时动态模板,因此该想法不适用于boost::range
。
我们可以有2个范围r1
和r2
,类型分别为R1
和R2
,当我们join
时,我们得到结果(将其命名为{ r12
类型的{1}}。
我们可以得到第三个范围(例如类型为boost::joined_range<R1,R2>
的{{1}}),然后r3
用R3
进行归类,我们将得到类型为join
的结果。 / p>
范围r12
,boost::joined_range<boost::joined_range<R1,R2>,R3>
,r1
等可以作为参数传递给可变参数模板函数,从参数列表中我们可以使编译器确定结果类型。同样,当我们使用固定长度集合(例如r2
或r3
)中的范围时,我们可以使编译器确定联接这些范围的结果类型。
但是,如果我们没有固定数量的范围,而是运行时动态数量(例如,来自std::tuple
的数量),那么我们将不知道联接这些类型的类型,并且编译器也无法确定它出来编译时间。但是,每种类型都必须是C ++中已知的编译时间。
因此,您要么必须找到一种方法来固定您加入编译时的范围数量,要么必须使用该范围的动态,未加入的集合(例如std::array
)作为数据类型,或者您必须使用诸如range-v3之类的第三种东西。