#include <map>
#include <string>
#include <algorithm>
#include <iterator>
#include <iostream>
// define the Sorter template class. If sortdir == true, then we sort ascending
template <bool sortdir = true>
struct Sorter
{
bool operator()(const std::string& left, const std::string& right)
{
if ( sortdir )
return left < right;
return left > right;
}
};
// our test maps
typedef std::pair<unsigned long long, unsigned long long> mapDataType;
// ascending map
std::map<std::string, mapDataType, Sorter<>> myMap = {{"abc", {0,0}}, {"def",{0,1}}};
// descending map
std::map<std::string, mapDataType, Sorter<false>> myMap2; // descending map
// sample program
using namespace std;
int main()
{
// copy to descending map
std::copy(myMap.begin(), myMap.end(), std::inserter(myMap2, myMap2.begin()));
cout << "The keys in ascending map are:\n";
for (auto it : myMap)
cout << it.first << "\n";
cout << "\nThe keys in descending map are:\n";
for (auto it : myMap2)
cout << it.first << "\n";
}
ICAgICNpbmNsdWRlIDxtYXA+CiAgICAjaW5jbHVkZSA8c3RyaW5nPgogICAgI2luY2x1ZGUgPGFsZ29yaXRobT4KICAgICNpbmNsdWRlIDxpdGVyYXRvcj4KICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KICAgIAogICAgLy8gZGVmaW5lIHRoZSBTb3J0ZXIgdGVtcGxhdGUgY2xhc3MuICBJZiBzb3J0ZGlyID09IHRydWUsIHRoZW4gd2Ugc29ydCBhc2NlbmRpbmcKICAgIHRlbXBsYXRlIDxib29sIHNvcnRkaXIgPSB0cnVlPgogICAgc3RydWN0IFNvcnRlcgogICAgewogICAgICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBzdGQ6OnN0cmluZyYgbGVmdCwgY29uc3Qgc3RkOjpzdHJpbmcmIHJpZ2h0KQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCBzb3J0ZGlyICkKICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0IDwgcmlnaHQ7CiAgICAgICAgICAgIHJldHVybiBsZWZ0ID4gcmlnaHQ7CiAgICAgICAgfQogICAgfTsKICAgIAogICAgLy8gb3VyIHRlc3QgbWFwcwogICAgdHlwZWRlZiBzdGQ6OnBhaXI8dW5zaWduZWQgbG9uZyBsb25nLCB1bnNpZ25lZCBsb25nIGxvbmc+IG1hcERhdGFUeXBlOwoKICAgIC8vIGFzY2VuZGluZyBtYXAKICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBtYXBEYXRhVHlwZSwgU29ydGVyPD4+IG15TWFwID0ge3siYWJjIiwgezAsMH19LCB7ImRlZiIsezAsMX19fTsgIAogICAgCiAgICAvLyBkZXNjZW5kaW5nIG1hcAogICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIG1hcERhdGFUeXBlLCBTb3J0ZXI8ZmFsc2U+PiBteU1hcDI7IC8vIGRlc2NlbmRpbmcgbWFwCgogICAgLy8gc2FtcGxlIHByb2dyYW0gICAgCiAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOwogICAgaW50IG1haW4oKSAKICAgIHsKICAgICAgICAvLyBjb3B5IHRvIGRlc2NlbmRpbmcgbWFwIAogICAgICAgIHN0ZDo6Y29weShteU1hcC5iZWdpbigpLCBteU1hcC5lbmQoKSwgc3RkOjppbnNlcnRlcihteU1hcDIsIG15TWFwMi5iZWdpbigpKSk7CgogICAgICAgIGNvdXQgPDwgIlRoZSBrZXlzIGluIGFzY2VuZGluZyBtYXAgYXJlOlxuIjsKICAgICAgICBmb3IgKGF1dG8gaXQgOiBteU1hcCkKICAgICAgICAJY291dCA8PCBpdC5maXJzdCA8PCAiXG4iOwogICAgICAgIGNvdXQgPDwgIlxuVGhlIGtleXMgaW4gZGVzY2VuZGluZyBtYXAgYXJlOlxuIjsKICAgICAgICBmb3IgKGF1dG8gaXQgOiBteU1hcDIpCiAgICAgICAgCWNvdXQgPDwgaXQuZmlyc3QgPDwgIlxuIjsKICAgICAgICAJCiAgICB9Cg==