升压范围库:顺序遍历两个范围

时间:2020-03-06 14:54:47  来源:igfitidea点击:

Boost范围库(http://www.boost.org/doc/libs/1_35_0/libs/range/index.html)使我们可以将一对迭代器抽象为一个范围。现在,我想将两个范围合并为一个范围,即:

给定两个范围r1和r2,定义遍历[r1.begin(),r1.end()[和然后[r2.begin(),r2.end()[]的r。有什么方法可以使用r1和r2将r定义为范围?

解决方案

我认为我们必须创建一个自定义的迭代器,当到达r1.end()时,它将把r1.end()滚动到r2.begin()。然后,该迭代器的Begin()和end()将合并到范围r中。 AFAIK没有标准的增强功能,可以为我们提供这种功能。

  • 我们不能两次调用该函数,一次在两个范围内调用一次吗?还是这种方法有问题?
  • 将两个范围复制到一个容器中并将其传递。
  • 编写我们自己的范围类,因此首先遍历r1,然后遍历r2.

我再次需要这个,所以我再看了一下。有一种使用boost / range / join.hpp连接两个范围的方法。不幸的是,输出范围类型未包含在界面中:

#include "boost/range/join.hpp"
#include "boost/foreach.hpp"
#include <iostream>

int main() {
        int a[] = {1, 2, 3, 4};
        int b[] = {7, 2, 3, 4};

        boost::iterator_range<int*> ai(&a[0], &a[4]);
        boost::iterator_range<int*> bi(&b[0], &b[4]);
        boost::iterator_range<
           boost::range_detail::
           join_iterator<int*, int*, int, int&, 
           boost::random_access_traversal_tag> > ci = boost::join(ai, bi); 

        BOOST_FOREACH(int& i, ci) {
                std::cout << i; //prints 12347234
        }
}

我使用编译器消息找到了输出类型。 C ++ 0xauto也将在那里相关。