#include <algorithm>
#include <iomanip>
#include <iostream>
#include <map>
#include <memory>
class Base {
public:
Base(int v) : id(v) {};
int id;
};
class Derived : public Base {
public:
Derived(int v) : Base(v) {};
};
struct Less_id
{
bool operator() (const std::shared_ptr<Derived> &lhs, const std::shared_ptr<Derived> &rhs) const
{
return lhs->id < rhs->id;
}
};
typedef std::map<std::shared_ptr<Derived>, double, Less_id> Map;
Map::const_iterator find_base(const Map &map, const std::shared_ptr<Base> &base)
{
auto it = std::lower_bound(
map.begin(), map.end(), base,
[](const Map::value_type &lhs, const std::shared_ptr<Base> &rhs)
{ return lhs.first->id < rhs->id; }
);
if (it != map.end() && it->first->id == base->id)
return it;
else
return map.end();
}
int main()
{
Map m;
m.insert(std::make_pair(std::make_shared<Derived>(1), 10));
m.insert(std::make_pair(std::make_shared<Derived>(3), 30));
m.insert(std::make_pair(std::make_shared<Derived>(4), 40));
m.insert(std::make_pair(std::make_shared<Derived>(2), 20));
auto b3 = std::make_shared<Base>(3);
auto it = find_base(m, b3);
std::cout << it->second << '\n';
auto b5 = std::make_shared<Base>(5);
it = find_base(m, b5);
std::cout << std::boolalpha << (it == m.end()) << '\n';
return 0;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvbWFuaXA+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPG1lbW9yeT4KCgpjbGFzcyBCYXNlIHsKcHVibGljOgogICAgQmFzZShpbnQgdikgOiBpZCh2KSB7fTsKICAgIGludCBpZDsgIAp9OwoKY2xhc3MgRGVyaXZlZCA6IHB1YmxpYyBCYXNlIHsKcHVibGljOgogICAgRGVyaXZlZChpbnQgdikgOiBCYXNlKHYpIHt9Owp9OwoKCnN0cnVjdCBMZXNzX2lkCnsKICBib29sIG9wZXJhdG9yKCkgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxEZXJpdmVkPiAmbGhzLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RGVyaXZlZD4gJnJocykgY29uc3QKICB7CiAgICByZXR1cm4gbGhzLT5pZCA8IHJocy0+aWQ7CiAgfQp9OwoKdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnNoYXJlZF9wdHI8RGVyaXZlZD4sIGRvdWJsZSwgTGVzc19pZD4gTWFwOwoKTWFwOjpjb25zdF9pdGVyYXRvciBmaW5kX2Jhc2UoY29uc3QgTWFwICZtYXAsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCYXNlPiAmYmFzZSkKewogIGF1dG8gaXQgPSBzdGQ6Omxvd2VyX2JvdW5kKAogICAgbWFwLmJlZ2luKCksIG1hcC5lbmQoKSwgYmFzZSwKICAgIFtdKGNvbnN0IE1hcDo6dmFsdWVfdHlwZSAmbGhzLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QmFzZT4gJnJocykKICAgIHsgcmV0dXJuIGxocy5maXJzdC0+aWQgPCByaHMtPmlkOyB9CiAgKTsKICBpZiAoaXQgIT0gbWFwLmVuZCgpICYmIGl0LT5maXJzdC0+aWQgPT0gYmFzZS0+aWQpCiAgICByZXR1cm4gaXQ7CiAgZWxzZQogICAgcmV0dXJuIG1hcC5lbmQoKTsKfQoKCgoKCmludCBtYWluKCkKewogICAgTWFwIG07CiAgICBtLmluc2VydChzdGQ6Om1ha2VfcGFpcihzdGQ6Om1ha2Vfc2hhcmVkPERlcml2ZWQ+KDEpLCAxMCkpOwogICAgbS5pbnNlcnQoc3RkOjptYWtlX3BhaXIoc3RkOjptYWtlX3NoYXJlZDxEZXJpdmVkPigzKSwgMzApKTsKICAgIG0uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHN0ZDo6bWFrZV9zaGFyZWQ8RGVyaXZlZD4oNCksIDQwKSk7CiAgICBtLmluc2VydChzdGQ6Om1ha2VfcGFpcihzdGQ6Om1ha2Vfc2hhcmVkPERlcml2ZWQ+KDIpLCAyMCkpOwoKICAgIGF1dG8gYjMgPSBzdGQ6Om1ha2Vfc2hhcmVkPEJhc2U+KDMpOwogICAgYXV0byBpdCA9IGZpbmRfYmFzZShtLCBiMyk7CiAgICBzdGQ6OmNvdXQgPDwgaXQtPnNlY29uZCA8PCAnXG4nOwogICAgCiAgICBhdXRvIGI1ID0gc3RkOjptYWtlX3NoYXJlZDxCYXNlPig1KTsKICAgIGl0ID0gZmluZF9iYXNlKG0sIGI1KTsKICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmJvb2xhbHBoYSA8PCAoaXQgPT0gbS5lbmQoKSkgPDwgJ1xuJzsKCiAgICByZXR1cm4gMDsKfQ==