#pragma once #include template class striding_iterator : public boost::iterator_adaptor, Iterator> { typedef boost::iterator_adaptor, Iterator> super_t; friend class boost::iterator_core_access; public: striding_iterator() : super_t() , stride(1) {} striding_iterator(Iterator it, int stride) : super_t(it) , stride(stride) {} template striding_iterator(striding_iterator const& r, typename boost::enable_if_convertible::type* = 0) : super_t(r.base()) {} int stride; private: void advance(typename super_t::difference_type n){ this->base_reference() += stride * n; } template typename super_t::difference_type distance_to(striding_iterator const & that) const { int s = that.base() - this->base(); if(s >= 0) return (s + stride - 1) / stride; return (s - stride + 1) / stride; } void increment() { advance(1); } void decrement() { advance(-1); } }; template striding_iterator strided(Iterator it, int stride = 1){ return striding_iterator(it, stride); }