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: " size () << endl;
41+  for  (auto & p : default_comparison) {
42+  cout << *(p.first ) << " : " 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: " size () << endl;
51+  for  (auto & p : basic) {
52+  cout << *(p.first ) << " : " 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: " size () << endl;
61+  for  (auto & p : with_decltype) {
62+  cout << *(p.first ) << " : " 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: " size () << endl;
71+  for  (auto & p : with_typedef) {
72+  cout << *(p.first ) << " : " 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