#include <vector>
#include <algorithm>
#include <map>
#include <string>
#include <iostream>
#include <iterator>
template <class T, class U>
class sorting_map
{
const std::map<T, U>& s_map;
public:
sorting_map(const std::map<T, U>& s_ ) : s_map(s_) {}
bool operator()(T x, T y) const { return s_map.at(x) < s_map.at(y); }
};
using namespace std;
int main()
{
map<string, int> tmap = {{"a", 5}, {"b", 1}, {"c", 3}, {"e", 6}, {"f", 10}, {"g", 8}};
vector<string> v = {"a", "b", "c", "f", "g"};
cout << "Before sorting: ";
copy(v.begin(), v.end(), ostream_iterator<string>(cout, " "));
cout << '\n';
sort(v.begin(), v.end(), sorting_map<string, int>(tmap));
cout << "After sorting: ";
copy(v.begin(), v.end(), ostream_iterator<string>(cout, " "));
cout << '\n';
map<string, int, sorting_map<string, int> > mymap3(tmap);
mymap3["a"] = 100;
mymap3["b"] = 200;
mymap3["c"] = 300;
for(auto i = mymap3.begin(); i!=mymap3.end(); ++i)
std::cout << "mymap3[" << i->first << "] = " << i->second << '\n';
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aXRlcmF0b3I+Cgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4KY2xhc3Mgc29ydGluZ19tYXAgCnsgCiAgICBjb25zdCBzdGQ6Om1hcDxULCBVPiYgc19tYXA7CiBwdWJsaWM6CiAgICBzb3J0aW5nX21hcChjb25zdCBzdGQ6Om1hcDxULCBVPiYgc18gKSA6IHNfbWFwKHNfKSB7fQogICAgYm9vbCBvcGVyYXRvcigpKFQgeCwgVCB5KSBjb25zdCB7IHJldHVybiBzX21hcC5hdCh4KSA8IHNfbWFwLmF0KHkpOyB9Cn07Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwppbnQgbWFpbigpCnsKICAgIG1hcDxzdHJpbmcsIGludD4gdG1hcCA9IHt7ImEiLCA1fSwgeyJiIiwgMX0sIHsiYyIsIDN9LCB7ImUiLCA2fSwgeyJmIiwgMTB9LCB7ImciLCA4fX07CgogICAgdmVjdG9yPHN0cmluZz4gdiA9IHsiYSIsICJiIiwgImMiLCAiZiIsICJnIn07IAoKICAgIGNvdXQgPDwgIkJlZm9yZSBzb3J0aW5nOiAiOwogICAgY29weSh2LmJlZ2luKCksIHYuZW5kKCksIG9zdHJlYW1faXRlcmF0b3I8c3RyaW5nPihjb3V0LCAiICIpKTsKICAgIGNvdXQgPDwgJ1xuJzsKCiAgICBzb3J0KHYuYmVnaW4oKSwgdi5lbmQoKSwgc29ydGluZ19tYXA8c3RyaW5nLCBpbnQ+KHRtYXApKTsKCiAgICBjb3V0IDw8ICJBZnRlciBzb3J0aW5nOiAiOwogICAgY29weSh2LmJlZ2luKCksIHYuZW5kKCksIG9zdHJlYW1faXRlcmF0b3I8c3RyaW5nPihjb3V0LCAiICIpKTsKICAgIGNvdXQgPDwgJ1xuJzsKCiAgICBtYXA8c3RyaW5nLCBpbnQsIHNvcnRpbmdfbWFwPHN0cmluZywgaW50PiA+IG15bWFwMyh0bWFwKTsgCiAgICBteW1hcDNbImEiXSA9IDEwMDsKICAgIG15bWFwM1siYiJdID0gMjAwOwogICAgbXltYXAzWyJjIl0gPSAzMDA7CiAgICBmb3IoYXV0byBpID0gbXltYXAzLmJlZ2luKCk7IGkhPW15bWFwMy5lbmQoKTsgKytpKQogICAgICAgIHN0ZDo6Y291dCA8PCAibXltYXAzWyIgPDwgaS0+Zmlyc3QgPDwgIl0gPSAiIDw8IGktPnNlY29uZCA8PCAnXG4nOwp9Cg==