Другая возможность (код не проверен, возможно, глючит). По сути, это то же самое, что и у Mos generate_n
, но другим путем. Вероятно, очевидно, что по сравнению с generate_n
это стоит делать, только если вы можете получить какое-то другое использование из flipflop_iterator
:
struct flipflop_iterator : public std::iterator<std::forward_iterator_tag, bool> {
bool offset; // make sure the first value is false
size_t remaining;
flipflop_iterator(size_t length) : offset(length % 2), remaining(length) {}
flipflop_iterator &operator++() {
--remaining;
return *this;
}
flipflop_iterator operator++(int) {
flipflop_iterator tmp(*this);
++(*this);
return tmp;
}
bool operator*() const {
return (remaining + offset) % 2;
}
bool operator==(const flipflop_iterator &rhs) const {
return remaining == rhs.remaining;
}
bool operator!=(const flipflop_iterator &rhs) const {
return !(*this == rhs);
}
};
std::vector<bool> v(flipflop_iterator(100), flipflop_iterator(0));
Вы можете улучшить производительность, сделав flipflop_iterator
итератор с произвольным доступом вместо прямого итератора, но я не могу не написать все эти функции-члены. В этом случае, вероятно, было бы лучше построить его из boost::counting_iterator
и boost::transform_iterator
.