Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Boost Range Library: Traversing Two Ranges Sequentially

Tags:

c++

Boost range library (http://www.boost.org/doc/libs/1_35_0/libs/range/index.html) allows us to abstract a pair of iterators into a range. Now I want to combine two ranges into one, viz:

given two ranges r1 and r2, define r which traverses [r1.begin(), r1.end()[ and then [r2.begin(), r2.end()[. Is there some way to define r as a range using r1 and r2?

like image 530
amit kumar Avatar asked Sep 30 '08 08:09

amit kumar


2 Answers

I needed this again so I had a second look. There is a way to concat two ranges using boost/range/join.hpp. Unluckily the output range type is not included in the interface:

#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
        }
}

I found the output type using the compiler messages. C++0x auto will be relevant there as well.

like image 88
amit kumar Avatar answered Sep 28 '22 14:09

amit kumar


  • Can't you call the function twice, once for both ranges? Or are there problems with this approach?
  • Copy the two ranges into one container and pass that.
  • Write your own range class, so it iterates through r1 first and and through r2 second.
like image 22
Peter Stuifzand Avatar answered Sep 28 '22 15:09

Peter Stuifzand