The PtrIter class template implements an input iterator whose operator* returns the address of the element the iterator refers to. Consider a std::unordered_map<std::string, DataType>. Its begin member returns an iterator whose operator* returns a std::pair<std::string, DataType> (const) &. This is usually what you want, but now assume we want to display the map's content, sorted by its keys. Sorting can simply be performed by defining a support vector containing pointers to the elements in the map, and then sorting the strings the pointers point at.
PtrIter is a tool that can be used to construct such a support vector, as shown in the EXAMPLE section.
PtrIter is a class template requiring one template type parameter: Iterator, the iterator's type (e.g., vector<string>::iterator)
PtrIter's users don't have to specify PtrIter's template type. The function template ptrIter, when provided with an iterator returns the matching PtrIter object.
PtrIter<set<string>::iterator> PtrIter(mySet.begin());
Copy and move constructors (and assignment operators) are available.
#include <algorithm> #include <unordered_map> #include <vector> #include <cstring> #include <iostream> #include <bobcat/ptriter> using namespace std; using namespace FBB; int main() { cout << "Enter lines, the first word will be the map's key; " "^D when done.\n"; string key; string line; unordered_map<string, string> map; while (cin >> key && getline(cin, line)) // fill the map map[key] = line; cout << '\n'; // initialize a support vector<decltype(&*map.begin())> // vector, using ptrIter support(ptrIter(map.begin()), ptrIter(map.end())); // sort 'support' typedef unordered_map<string, string>::value_type VT; sort(support.begin(), support.end(), [&](VT const *p1, VT const *p2) { return strcasecmp(p1->first.c_str(), p2->first.c_str()) < 0; } ); for(auto &element: support) // display sorted by key cout << element->first << ' ' << element->second << '\n'; }