Пропуск итератора - PullRequest
       33

Пропуск итератора

12 голосов
/ 16 апреля 2011

У меня есть последовательность значений, которую я хотел бы передать функции, которая принимает пару (iterator begin, iterator end).Однако я хочу, чтобы обрабатывался только каждый второй элемент в исходной последовательности.

Есть ли хороший способ использования Standard-Lib / Boost для создания фасада итератора, который позволит мне передать исходную последовательность?Я подумал, что что-то простое, подобное этому, уже было бы в итераторах наддува или библиотеках диапазонов, но я ничего не нашел.

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

Редактировать: Я знаю о filter_iterator, но этоФильтрует значения - это не меняет способ продвижения итерации.

Ответы [ 3 ]

6 голосов
/ 24 сентября 2014
3 голосов
/ 16 апреля 2011
struct TrueOnEven {
 template< typename T >
 bool operator()(const T&) { return mCount++ % 2 == 0; }
 TrueOnEven() : mCount(0) {}
 private:
  int mCount;
};

int main() {
 std::vector< int > tVec, tOtherVec;
 ...
 typedef boost::filter_iterator< TrueOnEven, int > TakeEvenFilterType;

 std::copy( 
  TakeEvenFilterType(tVec.begin(), tVec.end()),
  TakeEvenFilterType(tVec.end(), tVec.end()),
  std::back_inserter(tOtherVec));
}

Если честно, это не просто красиво и интуитивно понятно.Я написал простую библиотеку «Enumerator», включающую ленивые интегрированные запросы, чтобы избежать использования хотчпотча, подобного приведенному выше. Это позволяет писать:

Query::From(tVec.begin(), tVec.end())
.Skip<2>()
.ToStlSequence(std::back_inserter(tOtherVec));

, где Skip<2> в основном создает обобщенный «Фильтр», который пропускает каждый N-й (в данном случае каждый второй) элемент ...

Приветствия,

Пол

2 голосов
/ 16 апреля 2011

Вот итератор фильтра Boost . Это именно то, что вы хотите.

ОБНОВЛЕНИЕ: Извините, прочитайте неправильно. Вот список всех функций итераторов в Boost:

http://www.boost.org/doc/libs/1_46_1/libs/iterator/doc/#specialized-adaptors

Я думаю, что все, что вам нужно, - это простой iterator_adaptor с перегруженным operator++, который увеличивает базовое значение итератора в два раза.

...