Re: iterate over vector in leaps
Baruch Burstein <bmburstein@gmail.com> wrote:
can I make an iterator in a vector iterate over, say, every third element?
Here, this should get you started:
template < typename Container >
class jump_iterator : public iterator<forward_iterator_tag,
vector<int>::value_type> {
Container* container;
typename Container::iterator it;
int step;
public:
jump_iterator(Container& c, typename Container::iterator i,
int s = 0):
container(&c), it(i), step(s) { }
bool operator==(const jump_iterator& rhs) const {
return it == rhs.it;
}
jump_iterator& operator++() {
for (int i = 0; i < step && it != container->end(); ++i)
++it;
return *this;
}
jump_iterator operator++(int) {
jump_iterator result = *this;
++(*this);
return result;
}
reference operator*() { return *it; }
};
template < typename Container >
bool operator!=(const jump_iterator<Container>& lhs, const
jump_iterator<Container>& rhs) {
return !(lhs == rhs);
}
template < typename Container >
jump_iterator<Container> jump_iterator_begin(Container& c, int s) {
return jump_iterator<Container>(c, c.begin(), s);
}
template < typename Container >
jump_iterator<Container> jump_iterator_end(Container& c) {
return jump_iterator<Container>(c, c.end());
}
use the above like this:
void fn(vector<int>& vec) {
copy(jump_iterator_begin(vec, 3), jump_iterator_end(vec),
ostream_iterator<int>(cout, " "));
}