#include <cassert>
#include <algorithm>
#include <string>
#include <utility>
#include <vector>
template <typename Key, typename Value>
typename std::vector<std::pair<const Key, Value>>::const_iterator
my_find(const std::vector<std::pair<const Key, Value>>& v, const Key& key)
{
auto it = std::lower_bound(v.begin(), v.end(), key,
[](const std::pair<const Key, Value>& lhs, const Key& rhs) {
return lhs.first < rhs;
}
);
if (it != v.end() && it->first == key) {
return it;
}
return v.end();
}
int main()
{
const std::vector<std::pair<const std::string, int>> v = {
{"abc", 42},
{"bar", 51},
{"foo", 8}
};
assert(v.begin() + 1 == my_find(v, std::string("bar")));
assert(v.end() == my_find(v, std::string("not present")));
return 0;
}
I2luY2x1ZGUgPGNhc3NlcnQ+CgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dXRpbGl0eT4KI2luY2x1ZGUgPHZlY3Rvcj4KCnRlbXBsYXRlIDx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFZhbHVlPgp0eXBlbmFtZSBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgS2V5LCBWYWx1ZT4+Ojpjb25zdF9pdGVyYXRvcgpteV9maW5kKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxjb25zdCBLZXksIFZhbHVlPj4mIHYsIGNvbnN0IEtleSYga2V5KQp7CgoKICAgIGF1dG8gaXQgPSBzdGQ6Omxvd2VyX2JvdW5kKHYuYmVnaW4oKSwgdi5lbmQoKSwga2V5LAogICAgICAgIFtdKGNvbnN0IHN0ZDo6cGFpcjxjb25zdCBLZXksIFZhbHVlPiYgbGhzLCBjb25zdCBLZXkmIHJocykgewogICAgICAgICAgICByZXR1cm4gbGhzLmZpcnN0IDwgcmhzOwogICAgICAgIH0KICAgICk7CiAgICBpZiAoaXQgIT0gdi5lbmQoKSAmJiBpdC0+Zmlyc3QgPT0ga2V5KSB7CiAgICAgICAgcmV0dXJuIGl0OwogICAgfQogICAgcmV0dXJuIHYuZW5kKCk7Cn0KCmludCBtYWluKCkKewogICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGNvbnN0IHN0ZDo6c3RyaW5nLCBpbnQ+PiB2ID0gewogICAgICAgIHsiYWJjIiwgNDJ9LAogICAgICAgIHsiYmFyIiwgNTF9LAogICAgICAgIHsiZm9vIiwgOH0KICAgIH07CgogICAgYXNzZXJ0KHYuYmVnaW4oKSArIDEgPT0gbXlfZmluZCh2LCBzdGQ6OnN0cmluZygiYmFyIikpKTsKICAgIGFzc2VydCh2LmVuZCgpID09IG15X2ZpbmQodiwgc3RkOjpzdHJpbmcoIm5vdCBwcmVzZW50IikpKTsKCiAgICByZXR1cm4gMDsKfQo=