#include #include #include #include #include using namespace boost; using namespace std; template class noop_iterator : public iterator_facade, typename iterator_traits::value_type, forward_traversal_tag> { public: typedef typename iterator_traits::value_type value_t; explicit noop_iterator (Iter i) : iter (i) {} private: friend class iterator_core_access; void increment() { iter++; } value_t& dereference() const { return *iter; } Iter iter; bool equal (noop_iterator const& other) const { return other.iter == iter; } }; template class zippy_iterator : public iterator_facade, typename iterator_traits::value_type, forward_traversal_tag> { public: typedef typename Cont::value_type iter_t; typedef typename iterator_traits::value_type value_t; explicit zippy_iterator (Cont c) : cont (c), count (0) {} value_t& dereference() const { return *cont[count % cont.size()]; } void increment() { cont[count % cont.size()]++; count++; } bool equal (zippy_iterator const& other) const { for (int i = 0; i < cont.size(); i++) if (cont[i] != other.cont[i]) return false; return true; } private: Cont cont; int count; }; int main () { vector v (10); typedef vector::iterator vit; copy (noop_iterator (v.begin()), noop_iterator (v.end()), ostream_iterator (cout, "\n")); array a; vector v0 (10, 1); a[0] = v0.begin(); vector v1 (10); a[1] = v1.begin(); array b; b[0] = v0.end(); b[1] = v1.end(); typedef array a_t; zippy_iterator z1 (a); zippy_iterator z2 (b); copy (z1, z2, ostream_iterator (cout, " ")); }