#include #include #include template class zipper { class iterator { public: iterator(typename T::iterator tIt, typename Y::iterator yIt) : tIt(tIt), yIt(yIt) {} bool operator==(const iterator &i) { return (tIt==i.tIt || yIt==i.yIt); } std::tuple operator*() { return std::forward_as_tuple(*tIt, *yIt); } iterator& operator++() { ++tIt; ++yIt; return *this; } iterator operator++(int) { iterator tmp = *this; ++*this; return tmp; } bool operator!=(const iterator &i) { return (tIt!=i.tIt && yIt!=i.yIt); } private: typename T::iterator tIt; typename Y::iterator yIt; }; T& t; Y& y; public: zipper(T& t, Y& y) : t(t), y(y) {} iterator begin() { return iterator(t.begin(), y.begin()); } iterator end() { return iterator(t.end(), y.end()); } }; template zipper zip(T& t, Y& y) { return zipper(t, y); } using namespace std; int main() { vector v{0,1,2}; vector u{"five","four","three","two","one"}; for ( auto x : zip(u,v) ) { cout << get<0>(x) << "\t" << get<1>(x) << endl; } } /* Output: * "five 0" * "four 1" * "three 2" */