1+ #include " headers.h"
2+
3+ bool int_vector_iter_comp (const vector<int >::iterator iter1, const vector<int >::iterator iter2) {
4+ return *iter1 < *iter2;
5+ }
6+
7+ bool int_list_iter_comp (const list<int >::iterator iter1, const list<int >::iterator iter2) {
8+ return *iter1 < *iter2;
9+ }
10+
11+ int main () {
12+ // 1. Test vector<int>::iterator as key type
13+
14+ // Without providing custom comparison function
15+ map<vector<int >::iterator, int > default_comparison;
16+
17+ // Providing custom comparison function, check C++ Primer p247
18+ // Basic version
19+ map<vector<int >::iterator, int ,
20+ bool (*)(const vector<int >::iterator iter1, const vector<int >::iterator iter2)>
21+ basic (int_vector_iter_comp);
22+
23+ // use decltype
24+ map<vector<int >::iterator, int , decltype (int_vector_iter_comp)*> with_decltype (&int_vector_iter_comp);
25+
26+ // Use type alias or using
27+ typedef bool my_predicate (const vector<int >::iterator iter1, const vector<int >::iterator iter2);
28+ map<vector<int >::iterator, int , my_predicate*> with_typedef (&int_vector_iter_comp);
29+
30+ using my_predicate_pointer_type = bool (*)(const vector<int >::iterator iter1, const vector<int >::iterator iter2);
31+ map<vector<int >::iterator, int , my_predicate_pointer_type> with_using (&int_vector_iter_comp);
32+
33+ vector<int > v = {1 , 2 , 3 };
34+
35+ default_comparison.insert (pair<vector<int >::iterator, int >({v.end (), 0 }));
36+ default_comparison.insert (pair<vector<int >::iterator, int >({v.begin (), 0 }));
37+ default_comparison.insert (pair<vector<int >::iterator, int >({v.begin (), 1 }));
38+ default_comparison.insert (pair<vector<int >::iterator, int >({v.begin () + 1 , 1 }));
39+
40+ cout << " size: " << default_comparison.size () << endl;
41+ for (auto & p : default_comparison) {
42+ cout << *(p.first ) << " : " << p.second << endl;
43+ }
44+
45+ basic.insert (pair<vector<int >::iterator, int >({v.end (), 0 }));
46+ basic.insert (pair<vector<int >::iterator, int >({v.begin (), 0 }));
47+ basic.insert (pair<vector<int >::iterator, int >({v.begin (), 1 }));
48+ basic.insert (pair<vector<int >::iterator, int >({v.begin () + 1 , 1 }));
49+
50+ cout << " size: " << basic.size () << endl;
51+ for (auto & p : basic) {
52+ cout << *(p.first ) << " : " << p.second << endl;
53+ }
54+
55+ with_decltype.insert (pair<vector<int >::iterator, int >({v.end (), 0 }));
56+ with_decltype.insert (pair<vector<int >::iterator, int >({v.begin (), 0 }));
57+ with_decltype.insert (pair<vector<int >::iterator, int >({v.begin (), 1 }));
58+ with_decltype.insert (pair<vector<int >::iterator, int >({v.begin () + 1 , 1 }));
59+
60+ cout << " size: " << with_decltype.size () << endl;
61+ for (auto & p : with_decltype) {
62+ cout << *(p.first ) << " : " << p.second << endl;
63+ }
64+
65+ with_typedef.insert (pair<vector<int >::iterator, int >({v.end (), 0 }));
66+ with_typedef.insert (pair<vector<int >::iterator, int >({v.begin (), 0 }));
67+ with_typedef.insert (pair<vector<int >::iterator, int >({v.begin (), 1 }));
68+ with_typedef.insert (pair<vector<int >::iterator, int >({v.begin () + 1 , 1 }));
69+
70+ cout << " size: " << with_typedef.size () << endl;
71+ for (auto & p : with_typedef) {
72+ cout << *(p.first ) << " : " << p.second << endl;
73+ }
74+
75+ // 2. Test list<int>::iterator as key type
76+ map<list<int >::iterator, int > my_map;
77+ map<list<int >::iterator, int , decltype (int_list_iter_comp)*> my_map2;
78+
79+ list<int > l{1 , 2 , 3 };
80+
81+ // my_map.insert(pair<list<int>::iterator, int>({l.begin(), 1})); // Error, as list<int>::iterator has no < operator defined
82+ my_map2.insert (pair<list<int >::iterator, int >({l.begin (), 1 })); // ok, if you supply the comparison function
83+ }
0 commit comments