#include <map>
#include <iostream>
#include <algorithm>
#include <stdexcept>
//functor
template<class key, class value>
struct finder {
finder(const value& value_to_find) : v(&value_to_find){}
bool operator()(const std::pair<const key&, value>& node)
{return node.second == *v;}
protected:
const value* v;
};
template<class key, class value>
const key& find_key(const std::map<key, value>& container, const value& value_to_find) {
typename std::map<key, value>::const_iterator it;
it = std::find_if(container.begin(), container.end(), finder<key, value>(value_to_find));
if (it == container.end())
throw std::runtime_error("value is not in container!");
return it->first;
}
int main() {
std::map<int, int> container;
container[3] = 7;
std::cout << find_key(container, 7);
}
I2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8c3RkZXhjZXB0PgoKLy9mdW5jdG9yCnRlbXBsYXRlPGNsYXNzIGtleSwgY2xhc3MgdmFsdWU+CnN0cnVjdCBmaW5kZXIgewogICAgZmluZGVyKGNvbnN0IHZhbHVlJiB2YWx1ZV90b19maW5kKSA6IHYoJnZhbHVlX3RvX2ZpbmQpe30KICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBzdGQ6OnBhaXI8Y29uc3Qga2V5JiwgdmFsdWU+JiBub2RlKSAKICAgIHtyZXR1cm4gbm9kZS5zZWNvbmQgPT0gKnY7fQpwcm90ZWN0ZWQ6CiAgICBjb25zdCB2YWx1ZSogdjsKfTsKCnRlbXBsYXRlPGNsYXNzIGtleSwgY2xhc3MgdmFsdWU+CmNvbnN0IGtleSYgZmluZF9rZXkoY29uc3Qgc3RkOjptYXA8a2V5LCB2YWx1ZT4mIGNvbnRhaW5lciwgY29uc3QgdmFsdWUmIHZhbHVlX3RvX2ZpbmQpIHsKICAgIHR5cGVuYW1lIHN0ZDo6bWFwPGtleSwgdmFsdWU+Ojpjb25zdF9pdGVyYXRvciBpdDsKICAgIGl0ID0gc3RkOjpmaW5kX2lmKGNvbnRhaW5lci5iZWdpbigpLCBjb250YWluZXIuZW5kKCksIGZpbmRlcjxrZXksIHZhbHVlPih2YWx1ZV90b19maW5kKSk7CiAgICBpZiAoaXQgPT0gY29udGFpbmVyLmVuZCgpKQogICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigidmFsdWUgaXMgbm90IGluIGNvbnRhaW5lciEiKTsKICAgIHJldHVybiBpdC0+Zmlyc3Q7Cn0KCmludCBtYWluKCkgewogICAgc3RkOjptYXA8aW50LCBpbnQ+IGNvbnRhaW5lcjsKICAgIGNvbnRhaW5lclszXSA9IDc7CiAgICBzdGQ6OmNvdXQgPDwgZmluZF9rZXkoY29udGFpbmVyLCA3KTsKfQ==