View difference between Paste ID: szbFM5q4 and
SHOW: | | - or go back to the newest paste.
1-
1+
#include <iostream>
2
#include <vector>
3
#include <tuple>
4
5
template <class T, class Y>
6
class zipper {
7
	class iterator {
8
	public:
9
		iterator(typename T::iterator tIt, typename Y::iterator yIt) : tIt(tIt), yIt(yIt) {}
10
		bool operator==(const iterator &i) {
11
			return (tIt==i.tIt || yIt==i.yIt);
12
		}
13
		std::tuple<typename T::value_type&, typename Y::value_type&> operator*() {
14
			return std::forward_as_tuple(*tIt, *yIt);
15
		}
16
		iterator& operator++() {
17
			++tIt;
18
			++yIt;
19
			return *this;
20
		}
21
		iterator operator++(int) {
22
			iterator tmp = *this;
23
			++*this;
24
			return tmp;
25
		}
26
		bool operator!=(const iterator &i) {
27
			return (tIt!=i.tIt && yIt!=i.yIt);
28
		}
29
	private:
30
		typename T::iterator tIt;
31
		typename Y::iterator yIt;
32
	};
33
	T& t;
34
	Y& y;
35
public:
36
	zipper(T& t, Y& y) : t(t), y(y) {}
37
	iterator begin() { return iterator(t.begin(), y.begin()); }
38
	iterator end() { return iterator(t.end(), y.end()); }
39
};
40
41
template<class T, class Y>
42
zipper<T,Y> zip(T& t, Y& y) { return zipper<T,Y>(t, y); }
43
44
using namespace std;
45
46
int main() {
47
	vector<int> v{0,1,2};
48
	vector<string> u{"five","four","three","two","one"};
49
	for ( auto x : zip(u,v) ) {
50
		cout << get<0>(x) << "\t" << get<1>(x) << endl;
51
	}
52
}
53
54
/* Output:
55
 * "five    0"
56
 * "four    1"
57
 * "three   2"
58
 */