Числовой диапазон итераторов в бусте? - PullRequest
13 голосов
/ 27 февраля 2009

Я знаю об итераторах диапазона в boost, а что касается этой ссылки , кажется, что должен быть простой способ сделать то, что я хочу, но для меня это не очевидно.

Скажите, что я хочу представить числовой диапазон от 0 до 100 (включительно или нет), скажем range(0,100). Я хотел бы сделать что-то вроде:

for_each(range<int>(0,100).begin(), range<int>(0,100).end(), do_something);

, где do_something - функтор. Этим итераторам не нужно иметь нижний вектор или что-то в этом роде, а просто предлагать последовательность целых чисел. Возможно ли это с помощью увеличения диапазона? Можно ли вообще с обычными стандартными итераторами STL?

Ответы [ 3 ]

18 голосов
/ 27 февраля 2009

повышение :: counting_iterator

#include <boost/iterator/counting_iterator.hpp>

std::for_each( boost::counting_iterator<int>(0),
               boost::counting_iterator<int>(100),
               do_something );
9 голосов
/ 23 января 2015

Просто добавьте к другим ответам, если вы исходите из перспективы C ++ 11 - если вы предпочитаете использовать современные циклы for-each, вы можете сделать это еще более аккуратно с помощью boost counting_range :

#include <boost/range/counting_range.hpp>

for(auto const &i : boost::counting_range(0, 10)) {
  std::cout << i;
}

Выходы:

0123456789

5 голосов
/ 27 февраля 2009

Да, это возможно. Просто кажется, что boost :: range не имеет встроенной поддержки, но вы можете

  • используйте boost::counting_iterator, что делает именно то, что вы хотите
  • реализует числовой объект, чей operator*() возвращает число, и использует его как итератор для range
...