加入不定数量的范围

时间:2019-01-14 13:08:48

标签: c++ boost range

我需要串联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中是否存在另一种类似于联接的操作?

2 个答案:

答案 0 :(得分:2)

range-v3具有concatjoin视图,看来您想在此处加入视图:

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
}

Demo

答案 1 :(得分:1)

C ++没有运行时动态模板,因此该想法不适用于boost::range

我们可以有2个范围r1r2,类型分别为R1R2,当我们join时,我们得到结果(将其命名为{ r12类型的{1}}。

我们可以得到第三个范围(例如类型为boost::joined_range<R1,R2>的{​​{1}}),然后r3R3进行归类,我们将得到类型为join的结果。 / p>

范围r12boost::joined_range<boost::joined_range<R1,R2>,R3>r1等可以作为参数传递给可变参数模板函数,从参数列表中我们可以使编译器确定结果类型。同样,当我们使用固定长度集合(例如r2r3)中的范围时,我们可以使编译器确定联接这些范围的结果类型。

但是,如果我们没有固定数量的范围,而是运行时动态数量(例如,来自std::tuple的数量),那么我们将不知道联接这些类型的类型,并且编译器也无法确定它出来编译时间。但是,每种类型都必须是C ++中已知的编译时间。

因此,您要么必须找到一种方法来固定您加入编译时的范围数量,要么必须使用该范围的动态,未加入的集合(例如std::array)作为数据类型,或者您必须使用诸如range-v3之类的第三种东西。