Подтвердить что ты не робот

Пропускающий итератор

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

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

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

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

4b9b3361

Ответ 2

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", включающую ленивые интегрированные запросы, чтобы избежать hotchpotch, как указано выше. Он позволяет вам писать:

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

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

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

Пол

Ответ 3

Здесь Boost фильтр-итератор. Это именно то, что вы хотите.

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

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

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