#include <map>
#include <algorithm>
#include <iostream>
template<class Map, class KeyCompareType, class Iterator = typename Map::const_iterator>
Iterator findInMap(const Map &map, const KeyCompareType &key) {
typedef typename Map::value_type value_type;
auto predicate = [](const value_type & entry, const KeyCompareType & key) {
return entry.first < key;
};
Iterator it = std::lower_bound(map.begin(), map.end(), key, predicate);
if (it != map.end()) {
if (!(it->first == key))
it = map.end();
}
return it;
}
struct ClassA {
int value;
};
bool operator==(const ClassA &a, const ClassA &b) {
return a.value == b.value;
}
bool operator<(const ClassA &a, const ClassA &b) {
return a.value < b.value;
}
struct ClassB {
int value;
};
bool operator==(const ClassA &a, const ClassB &b) {
return a.value == b.value;
}
bool operator<(const ClassA &a, const ClassB &b) {
return a.value < b.value;
}
int main() {
std::map<ClassA, int> foo;
foo.insert({{1}, 1});
foo.insert({{2}, 2});
foo.insert({{3}, 3});
std::vector<ClassB> testCases = {{1}, {2}, {3}, {4}};
for (ClassB testCase : testCases) {
std::cout << "Looking up " << testCase.value << " -> ";
auto it = findInMap(foo, testCase);
if (it == foo.end())
std::cout << "Not found." << std::endl;
else
std::cout << "Found: " << it->second << std::endl;
}
}
I2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8Y2xhc3MgTWFwLCBjbGFzcyBLZXlDb21wYXJlVHlwZSwgY2xhc3MgSXRlcmF0b3IgPSB0eXBlbmFtZSBNYXA6OmNvbnN0X2l0ZXJhdG9yPgpJdGVyYXRvciBmaW5kSW5NYXAoY29uc3QgTWFwICZtYXAsIGNvbnN0IEtleUNvbXBhcmVUeXBlICZrZXkpIHsKICAgIHR5cGVkZWYgdHlwZW5hbWUgTWFwOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CiAgICBhdXRvIHByZWRpY2F0ZSA9IFtdKGNvbnN0IHZhbHVlX3R5cGUgJiBlbnRyeSwgY29uc3QgS2V5Q29tcGFyZVR5cGUgJiBrZXkpIHsKICAgICAgICByZXR1cm4gZW50cnkuZmlyc3QgPCBrZXk7CiAgICB9OwogICAgSXRlcmF0b3IgaXQgPSBzdGQ6Omxvd2VyX2JvdW5kKG1hcC5iZWdpbigpLCBtYXAuZW5kKCksIGtleSwgcHJlZGljYXRlKTsKICAgIGlmIChpdCAhPSBtYXAuZW5kKCkpIHsKICAgICAgICBpZiAoIShpdC0+Zmlyc3QgPT0ga2V5KSkKICAgICAgICAgICAgaXQgPSBtYXAuZW5kKCk7CiAgICB9CiAgICByZXR1cm4gaXQ7Cn0KCnN0cnVjdCBDbGFzc0EgewogICAgaW50IHZhbHVlOwp9Owpib29sIG9wZXJhdG9yPT0oY29uc3QgQ2xhc3NBICZhLCBjb25zdCBDbGFzc0EgJmIpIHsKICAgIHJldHVybiBhLnZhbHVlID09IGIudmFsdWU7Cn0KYm9vbCBvcGVyYXRvcjwoY29uc3QgQ2xhc3NBICZhLCBjb25zdCBDbGFzc0EgJmIpIHsKICAgIHJldHVybiBhLnZhbHVlIDwgYi52YWx1ZTsKfQoKc3RydWN0IENsYXNzQiB7CiAgICBpbnQgdmFsdWU7Cn07Cgpib29sIG9wZXJhdG9yPT0oY29uc3QgQ2xhc3NBICZhLCBjb25zdCBDbGFzc0IgJmIpIHsKICAgIHJldHVybiBhLnZhbHVlID09IGIudmFsdWU7Cn0KYm9vbCBvcGVyYXRvcjwoY29uc3QgQ2xhc3NBICZhLCBjb25zdCBDbGFzc0IgJmIpIHsKICAgIHJldHVybiBhLnZhbHVlIDwgYi52YWx1ZTsKfQoKCgoKaW50IG1haW4oKSB7CiAgICBzdGQ6Om1hcDxDbGFzc0EsIGludD4gZm9vOwogICAgZm9vLmluc2VydCh7ezF9LCAxfSk7CiAgICBmb28uaW5zZXJ0KHt7Mn0sIDJ9KTsKICAgIGZvby5pbnNlcnQoe3szfSwgM30pOwoKICAgIHN0ZDo6dmVjdG9yPENsYXNzQj4gdGVzdENhc2VzID0ge3sxfSwgezJ9LCB7M30sIHs0fX07CgogICAgZm9yIChDbGFzc0IgdGVzdENhc2UgOiB0ZXN0Q2FzZXMpIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIkxvb2tpbmcgdXAgIiA8PCB0ZXN0Q2FzZS52YWx1ZSA8PCAiIC0+ICI7CiAgICAgICAgYXV0byBpdCA9IGZpbmRJbk1hcChmb28sIHRlc3RDYXNlKTsKICAgICAgICBpZiAoaXQgPT0gZm9vLmVuZCgpKQogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk5vdCBmb3VuZC4iIDw8IHN0ZDo6ZW5kbDsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiRm91bmQ6ICIgPDwgaXQtPnNlY29uZCA8PCBzdGQ6OmVuZGw7CiAgICB9Cn0KCg==