Ответ 1
Я думаю, вы хотите boost:: adapters:: strided
У меня есть последовательность значений, которые я хотел бы передать функции, которая принимает пару (iterator begin, iterator end)
. Тем не менее, я хочу, чтобы каждый второй элемент в исходной последовательности обрабатывался.
Есть ли хороший способ использовать Standard-Lib/Boost для создания фасада итератора, который позволит мне пройти в исходной последовательности? Я понял, что что-то простое, как это было бы уже в итераторах повышения или библиотеках диапазонов, но я ничего не нашел.
Или я пропустил еще один совершенно очевидный способ сделать это? Конечно, я знаю, что у меня всегда есть возможность копировать значения в другую последовательность, но это не то, что я хочу сделать.
Изменить: Я знаю о filter_iterator
, но это фильтрует значения - это не меняет способ продвижения итерации.
Я думаю, вы хотите boost:: adapters:: strided
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-й (в данном случае каждый второй) элемент...
Приветствия,
Пол
Здесь Boost фильтр-итератор. Это именно то, что вы хотите.
ОБНОВЛЕНИЕ: Извините, прочитайте неправильно. Вот список всех возможностей итератора в Boost:
http://www.boost.org/doc/libs/1_46_1/libs/iterator/doc/#specialized-adaptors
Я думаю, что простой итератор_адаптор с перегруженным operator++
, который увеличивает значение базового итератора дважды, - это все, что вам нужно.