#include <iostream>
#include <memory>
#include <set>
struct Person {
std::string name;
std::string address;
Person( std::string n, std::string a ) : name( std::move(n) ), address( std::move(a) ) {}
};
using PersonPtr = std::shared_ptr<Person>;
struct CmpName {
using is_transparent = void;
bool operator()( const PersonPtr &p1, const PersonPtr &p2 ) const { return p1->name < p2->name; }
bool operator()( const std::string &s, const PersonPtr &p2 ) const { return s < p2->name; }
bool operator()( const PersonPtr &p1, const std::string &s ) const { return p1->name < s; }
};
int main() {
std::set<PersonPtr,CmpName> byName;
byName.insert( std::make_shared<Person>( "John", "Earth" ) );
auto f = byName.find( "John" );
if( f != byName.end() ) std::cout << "found " << (*f)->name << std::endl;
};
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8c2V0PgoKc3RydWN0IFBlcnNvbiB7CiAgICBzdGQ6OnN0cmluZyBuYW1lOwogICAgc3RkOjpzdHJpbmcgYWRkcmVzczsKICAgIAogICAgUGVyc29uKCBzdGQ6OnN0cmluZyBuLCBzdGQ6OnN0cmluZyBhICkgOiBuYW1lKCBzdGQ6Om1vdmUobikgKSwgYWRkcmVzcyggc3RkOjptb3ZlKGEpICkge30KfTsKCnVzaW5nIFBlcnNvblB0ciA9IHN0ZDo6c2hhcmVkX3B0cjxQZXJzb24+OwoKc3RydWN0IENtcE5hbWUgewoJdXNpbmcgaXNfdHJhbnNwYXJlbnQgPSB2b2lkOwoJCiAgICBib29sIG9wZXJhdG9yKCkoIGNvbnN0IFBlcnNvblB0ciAmcDEsIGNvbnN0IFBlcnNvblB0ciAmcDIgKSBjb25zdCB7IHJldHVybiBwMS0+bmFtZSA8IHAyLT5uYW1lOyB9CiAgICBib29sIG9wZXJhdG9yKCkoIGNvbnN0IHN0ZDo6c3RyaW5nICZzLCBjb25zdCBQZXJzb25QdHIgJnAyICkgY29uc3QgeyByZXR1cm4gcyA8IHAyLT5uYW1lOyB9CiAgICBib29sIG9wZXJhdG9yKCkoIGNvbnN0IFBlcnNvblB0ciAmcDEsIGNvbnN0IHN0ZDo6c3RyaW5nICZzICkgY29uc3QgeyByZXR1cm4gcDEtPm5hbWUgPCBzOyB9Cn07CgppbnQgbWFpbigpIHsKICAgIHN0ZDo6c2V0PFBlcnNvblB0cixDbXBOYW1lPiBieU5hbWU7CiAgICAKICAgIGJ5TmFtZS5pbnNlcnQoIHN0ZDo6bWFrZV9zaGFyZWQ8UGVyc29uPiggIkpvaG4iLCAiRWFydGgiICkgKTsKICAgIGF1dG8gZiA9IGJ5TmFtZS5maW5kKCAiSm9obiIgKTsKICAgIGlmKCBmICE9IGJ5TmFtZS5lbmQoKSApIHN0ZDo6Y291dCA8PCAiZm91bmQgIiA8PCAoKmYpLT5uYW1lIDw8IHN0ZDo6ZW5kbDsKICAgIAp9Ow==