Я проходил через boost::range
библиотека и заметил, что boost :: range_iterator и boost::iterator_range
, Я запутался с этими условиями здесь. Может кто-нибудь объяснить, в чем разница между двумя и когда использовать что? Кроме того, было бы неплохо, если бы вы могли указать мне примеры примеров, в которых используется библиотека диапазона увеличения, чтобы узнать о ней больше, кроме документации. Спасибо
Может кто-нибудь объяснить, в чем разница между двумя и когда использовать что?
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());
}
Кроме того, было бы неплохо, если бы вы могли указать мне примеры примеров, где используется библиотека диапазона увеличения, чтобы узнать о ней больше, кроме документации
Для быстрого ознакомления — проверьте это слайды
Как правило, вы не будете использовать boost::range_iterator
напрямую, поскольку это метафункция шаблона, которая принимает заданный диапазон (независимо от типа диапазона) и возвращает тип его методов begin () / end ().
boost::iterator_range
используется для создания нового диапазона из пары уже существующих итераторов. Это вы, скорее всего, будете использовать чаще, когда берете код, который все еще основан на итераторах, и используете его для преобразования в диапазон.