#include <unordered_map>
#include <map>
#include <vector>
#include <algorithm>
#include <type_traits>
#include <string>
#include <iostream>
int main()
{
using namespace std;
std::unordered_map<std::string, const int> master =
{{ {"ABC", 123}
, {"GHI", 345}
, {"DEF", 123}
, {"XYZ", 234}
, {"UVW", 234}
}};
std::cout << "=== master data(unordered_map) ===\n";
for(const auto& p : master)
std::cout << p.first << " : " << p.second << "\n";
auto sorted_by_key =
std::map<decltype(master)::key_type, decltype(master)::mapped_type>
(std::begin(master), std::end(master))
;
std::cout << "=== sort by key ===\n";
for(const auto& p : sorted_by_key)
std::cout << p.first << " : " << p.second << "\n";
std::vector
< std::pair<std::remove_const<decltype(sorted_by_key)::key_type>::type
, std::remove_const<decltype(sorted_by_key)::mapped_type>::type>
> sorted_by_mapped(std::begin(sorted_by_key), std::end(sorted_by_key));
std::stable_sort
( std::begin(sorted_by_mapped), std::end(sorted_by_mapped)
, [](const decltype(sorted_by_mapped)::value_type& a, const decltype(sorted_by_mapped)::value_type& b)
{ return a.second < b.second; }
);
std::cout << "=== sort by mapped (with stable key)\n";
for(const auto& p : sorted_by_mapped)
std::cout << p.first << " : " << p.second << "\n";
}
I2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CiNpbmNsdWRlIDxtYXA+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKaW50IG1haW4oKQp7CiAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKICAKICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIGNvbnN0IGludD4gbWFzdGVyID0KICB7eyB7IkFCQyIsIDEyM30KICAsICB7IkdISSIsIDM0NX0KICAsICB7IkRFRiIsIDEyM30KICAsICB7IlhZWiIsIDIzNH0KICAsICB7IlVWVyIsIDIzNH0KICB9fTsKICAKICBzdGQ6OmNvdXQgPDwgIj09PSBtYXN0ZXIgZGF0YSh1bm9yZGVyZWRfbWFwKSA9PT1cbiI7CiAgZm9yKGNvbnN0IGF1dG8mIHAgOiBtYXN0ZXIpCiAgICBzdGQ6OmNvdXQgPDwgcC5maXJzdCA8PCAiIDogIiA8PCBwLnNlY29uZCA8PCAiXG4iOwogIAogIGF1dG8gc29ydGVkX2J5X2tleSA9CiAgICBzdGQ6Om1hcDxkZWNsdHlwZShtYXN0ZXIpOjprZXlfdHlwZSwgZGVjbHR5cGUobWFzdGVyKTo6bWFwcGVkX3R5cGU+CiAgICAoc3RkOjpiZWdpbihtYXN0ZXIpLCBzdGQ6OmVuZChtYXN0ZXIpKQogICAgOwogIAogIHN0ZDo6Y291dCA8PCAiPT09IHNvcnQgYnkga2V5ID09PVxuIjsKICBmb3IoY29uc3QgYXV0byYgcCA6IHNvcnRlZF9ieV9rZXkpCiAgICBzdGQ6OmNvdXQgPDwgcC5maXJzdCA8PCAiIDogIiA8PCBwLnNlY29uZCA8PCAiXG4iOwogIAogIHN0ZDo6dmVjdG9yCiAgPCBzdGQ6OnBhaXI8c3RkOjpyZW1vdmVfY29uc3Q8ZGVjbHR5cGUoc29ydGVkX2J5X2tleSk6OmtleV90eXBlPjo6dHlwZQogICwgc3RkOjpyZW1vdmVfY29uc3Q8ZGVjbHR5cGUoc29ydGVkX2J5X2tleSk6Om1hcHBlZF90eXBlPjo6dHlwZT4KICA+IHNvcnRlZF9ieV9tYXBwZWQoc3RkOjpiZWdpbihzb3J0ZWRfYnlfa2V5KSwgc3RkOjplbmQoc29ydGVkX2J5X2tleSkpOwogIAogIHN0ZDo6c3RhYmxlX3NvcnQKICAoIHN0ZDo6YmVnaW4oc29ydGVkX2J5X21hcHBlZCksIHN0ZDo6ZW5kKHNvcnRlZF9ieV9tYXBwZWQpCiAgLCBbXShjb25zdCBkZWNsdHlwZShzb3J0ZWRfYnlfbWFwcGVkKTo6dmFsdWVfdHlwZSYgYSwgY29uc3QgZGVjbHR5cGUoc29ydGVkX2J5X21hcHBlZCk6OnZhbHVlX3R5cGUmIGIpCiAgICB7IHJldHVybiBhLnNlY29uZCA8IGIuc2Vjb25kOyB9CiAgKTsKICAKICBzdGQ6OmNvdXQgPDwgIj09PSBzb3J0IGJ5IG1hcHBlZCAod2l0aCBzdGFibGUga2V5KVxuIjsKICBmb3IoY29uc3QgYXV0byYgcCA6IHNvcnRlZF9ieV9tYXBwZWQpCiAgICBzdGQ6OmNvdXQgPDwgcC5maXJzdCA8PCAiIDogIiA8PCBwLnNlY29uZCA8PCAiXG4iOwp9