#include <iostream>
#include <map>
using namespace std;
struct CompareString
{
using is_transparent = void;
bool operator()(const std::string& l, const string& r) const
{
return l.compare(r) < 0;
}
template<typename T>
bool operator()(const std::string& l, const T& r) const
{
return l.compare(r) < 0;
}
template<typename T>
bool operator()(const T& l, const std::string& r) const
{
return r.compare(l) > 0;
}
};
using StrStrMap = std::map<std::string,std::string, CompareString>;
template<typename K>
const std::string* findPtr(const StrStrMap& c, const K& k) {
auto iter = c.find(k);
if (iter == c.end()) return nullptr;
return &iter->second;
}
const std::string& fromPtr(const std::string* s) {
static const std::string def{"(null)"};
if (!s) return def;
return *s;
}
int main() {
StrStrMap m{{"abc", "123"}, {"def", "456"}};
const char kctrl1[] = "abc";
const std::string kstd1 = "abc";
cout << __LINE__ << " " << fromPtr(findPtr(m, kstd1)) << endl;
cout << __LINE__ << " " << fromPtr(findPtr(m, kctrl1)) << endl;
auto it = m.find(kstd1);
if (it != m.end()) cout << it->second << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IENvbXBhcmVTdHJpbmcKewogICAgdXNpbmcgaXNfdHJhbnNwYXJlbnQgPSB2b2lkOwoKICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBzdGQ6OnN0cmluZyYgbCwgY29uc3Qgc3RyaW5nJiByKSBjb25zdAogICAgewogICAgICAgIHJldHVybiBsLmNvbXBhcmUocikgPCAwOwogICAgfQoKICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICBib29sIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjpzdHJpbmcmIGwsIGNvbnN0IFQmIHIpIGNvbnN0CiAgICB7CiAgICAgICAgcmV0dXJuIGwuY29tcGFyZShyKSA8IDA7CiAgICB9CgogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUJiBsLCBjb25zdCBzdGQ6OnN0cmluZyYgcikgY29uc3QKICAgIHsKICAgICAgICByZXR1cm4gci5jb21wYXJlKGwpID4gMDsKICAgIH0KfTsKCnVzaW5nIFN0clN0ck1hcCA9IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLHN0ZDo6c3RyaW5nLCBDb21wYXJlU3RyaW5nPjsKCnRlbXBsYXRlPHR5cGVuYW1lIEs+IApjb25zdCBzdGQ6OnN0cmluZyogZmluZFB0cihjb25zdCBTdHJTdHJNYXAmIGMsIGNvbnN0IEsmIGspIHsKICAgIGF1dG8gaXRlciA9IGMuZmluZChrKTsKICAgIGlmIChpdGVyID09IGMuZW5kKCkpIHJldHVybiBudWxscHRyOwogICAgcmV0dXJuICZpdGVyLT5zZWNvbmQ7Cn0KCmNvbnN0IHN0ZDo6c3RyaW5nJiBmcm9tUHRyKGNvbnN0IHN0ZDo6c3RyaW5nKiBzKSB7CiAgICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgZGVmeyIobnVsbCkifTsKICAgIGlmICghcykgcmV0dXJuIGRlZjsKICAgIHJldHVybiAqczsKfQoKCmludCBtYWluKCkgewogICAgU3RyU3RyTWFwIG17eyJhYmMiLCAiMTIzIn0sIHsiZGVmIiwgIjQ1NiJ9fTsKICAgIGNvbnN0IGNoYXIga2N0cmwxW10gPSAiYWJjIjsKICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGtzdGQxID0gImFiYyI7CgogICAgY291dCA8PCBfX0xJTkVfXyA8PCAiICIgPDwgZnJvbVB0cihmaW5kUHRyKG0sIGtzdGQxKSkgPDwgZW5kbDsKICAgIGNvdXQgPDwgX19MSU5FX18gPDwgIiAiIDw8IGZyb21QdHIoZmluZFB0cihtLCBrY3RybDEpKSA8PCBlbmRsOwoKICAgIGF1dG8gaXQgPSBtLmZpbmQoa3N0ZDEpOwogICAgaWYgKGl0ICE9IG0uZW5kKCkpIGNvdXQgPDwgaXQtPnNlY29uZCA8PCBlbmRsOwoKICAgIHJldHVybiAwOwp9