boost :: range_iterator и boost :: iterator_range путаница

Я проходил через boost::range библиотека и заметил, что boost :: range_iterator и boost::iterator_range, Я запутался с этими условиями здесь. Может кто-нибудь объяснить, в чем разница между двумя и когда использовать что? Кроме того, было бы неплохо, если бы вы могли указать мне примеры примеров, в которых используется библиотека диапазона увеличения, чтобы узнать о ней больше, кроме документации. Спасибо

10

Решение

Может кто-нибудь объяснить, в чем разница между двумя и когда использовать что?

range_iterator используется для получения типа итератора диапазона следующим образом:

range_iterator< SomeRange >::type

Это похоже на что-то СТД :: iterator_traits. Например, вы можете получить тип значения из итератора:

std::iterator_traits<int*>::value_type

iterator_range — это мост между диапазонами и итераторами. Например — у вас есть пара итераторов, и вы хотите передать их алгоритму, который принимает только диапазоны. В этом случае вы можете обернуть ваши итераторы в диапазон, используя iterator_range. Или лучше — make_iterator_range — это поможет вывести типы (как это делает std :: make_pair):

make_iterator_range(iterator1,iterator2)

возвращает диапазон.

Рассмотрим следующий пример:

живое демо

#include <boost/range/iterator_range.hpp>
#include <boost/range/algorithm.hpp>
#include <boost/range/iterator.hpp>
#include <typeinfo>
#include <iostream>
#include <ostream>

using namespace boost;
using namespace std;

struct print
{
template<typename T>
void operator()(const T &t) const
{
cout << t << " ";
}
};

int main()
{
typedef int Array[20];
cout << typeid( range_iterator<Array>::type ).name() << endl;

Array arr={11,22,33,44,55,66,77,88};
boost::for_each( make_iterator_range(arr,arr+5) ,print());
}

Кроме того, было бы неплохо, если бы вы могли указать мне примеры примеров, где используется библиотека диапазона увеличения, чтобы узнать о ней больше, кроме документации

Для быстрого ознакомления — проверьте это слайды

9

Другие решения

Как правило, вы не будете использовать boost::range_iterator напрямую, поскольку это метафункция шаблона, которая принимает заданный диапазон (независимо от типа диапазона) и возвращает тип его методов begin () / end ().

boost::iterator_range используется для создания нового диапазона из пары уже существующих итераторов. Это вы, скорее всего, будете использовать чаще, когда берете код, который все еще основан на итераторах, и используете его для преобразования в диапазон.

3