#include <algorithm>
#include <functional>
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
const auto cmp1 = [ordering = { "dog"s, "cat"s, "mouse"s, "elephant"s }](const string& lhs, const string& rhs) { return find(cbegin(ordering), cend(ordering), lhs) < find(cbegin(ordering), cend(ordering), rhs); };
const auto cmp2 = [ordering = { "dog", "cat", "mouse", "elephant" }](const string& lhs, const string& rhs) { return find(cbegin(ordering), cend(ordering), lhs) < find(cbegin(ordering), cend(ordering), rhs); };
map<string, int, function<bool(const string&, const string&)>> myMap1(cmp1);
myMap1["cat"s] = 1;
myMap1["dog"s] = 2;
myMap1["elephant"s] = 3;
myMap1["mouse"s] = 4;
myMap1["rhino"s] = 5;
cout << "Wrong:\n";
for (auto& i : myMap1) {
cout << '\t' << i.first << ' ' << i.second << endl;
}
map<string, int, function<bool(const string&, const string&)>> myMap2(cmp2);
myMap2["cat"s] = 1;
myMap2["dog"s] = 2;
myMap2["elephant"s] = 3;
myMap2["mouse"s] = 4;
myMap2["rhino"s] = 5;
cout << "Right:\n";
for (auto& i : myMap2) {
cout << '\t' << i.first << ' ' << i.second << endl;
}
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPHN0cmluZz4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgbWFpbigpIHsKCWNvbnN0IGF1dG8gY21wMSA9IFtvcmRlcmluZyA9IHsgImRvZyJzLCAiY2F0InMsICJtb3VzZSJzLCAiZWxlcGhhbnQicyB9XShjb25zdCBzdHJpbmcmIGxocywgY29uc3Qgc3RyaW5nJiByaHMpIHsgcmV0dXJuIGZpbmQoY2JlZ2luKG9yZGVyaW5nKSwgY2VuZChvcmRlcmluZyksIGxocykgPCBmaW5kKGNiZWdpbihvcmRlcmluZyksIGNlbmQob3JkZXJpbmcpLCByaHMpOyB9OwoJY29uc3QgYXV0byBjbXAyID0gW29yZGVyaW5nID0geyAiZG9nIiwgImNhdCIsICJtb3VzZSIsICJlbGVwaGFudCIgfV0oY29uc3Qgc3RyaW5nJiBsaHMsIGNvbnN0IHN0cmluZyYgcmhzKSB7IHJldHVybiBmaW5kKGNiZWdpbihvcmRlcmluZyksIGNlbmQob3JkZXJpbmcpLCBsaHMpIDwgZmluZChjYmVnaW4ob3JkZXJpbmcpLCBjZW5kKG9yZGVyaW5nKSwgcmhzKTsgfTsKCgltYXA8c3RyaW5nLCBpbnQsIGZ1bmN0aW9uPGJvb2woY29uc3Qgc3RyaW5nJiwgY29uc3Qgc3RyaW5nJik+PiBteU1hcDEoY21wMSk7CgoJbXlNYXAxWyJjYXQic10gPSAxOwoJbXlNYXAxWyJkb2cic10gPSAyOwoJbXlNYXAxWyJlbGVwaGFudCJzXSA9IDM7CglteU1hcDFbIm1vdXNlInNdID0gNDsKCW15TWFwMVsicmhpbm8ic10gPSA1OwoKICAgIGNvdXQgPDwgIldyb25nOlxuIjsKCglmb3IgKGF1dG8mIGkgOiBteU1hcDEpIHsKCQljb3V0IDw8ICdcdCcgPDwgaS5maXJzdCA8PCAnICcgPDwgaS5zZWNvbmQgPDwgZW5kbDsKCX0KCQoJbWFwPHN0cmluZywgaW50LCBmdW5jdGlvbjxib29sKGNvbnN0IHN0cmluZyYsIGNvbnN0IHN0cmluZyYpPj4gbXlNYXAyKGNtcDIpOwoKCW15TWFwMlsiY2F0InNdID0gMTsKCW15TWFwMlsiZG9nInNdID0gMjsKCW15TWFwMlsiZWxlcGhhbnQic10gPSAzOwoJbXlNYXAyWyJtb3VzZSJzXSA9IDQ7CglteU1hcDJbInJoaW5vInNdID0gNTsKCQoJY291dCA8PCAiUmlnaHQ6XG4iOwoKCWZvciAoYXV0byYgaSA6IG15TWFwMikgewoJCWNvdXQgPDwgJ1x0JyA8PCBpLmZpcnN0IDw8ICcgJyA8PCBpLnNlY29uZCA8PCBlbmRsOwoJfQkKfQ==