#include <unordered_map>
#include <string>
#include <iostream>
template<typename Map, typename T>
std::pair<typename Map::iterator, bool>
insert_or_assign(Map& m, const typename Map::key_type& k, const T& t)
{
auto p = m.insert({k, t});
if (!p.second) {
// overwrite previous value
p.first->second = t;
}
return p;
}
int main() {
auto map = std::unordered_map<std::string, int>{{"foo", 1}, {"bar", 2}};
auto p = map.insert({"foo", 3});
if (p.second) {
// it has just been inserted.
std::cout << "foo was inserted\n";
} else {
// it has been assigned
std::cout << "foo was assigned\n";
}
p = map.insert({"hi", 42});
if (p.second) {
// it has just been inserted.
std::cout << "hi was inserted\n";
} else {
// it has been assigned
std::cout << "hi was assigned\n";
}
}
I2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnRlbXBsYXRlPHR5cGVuYW1lIE1hcCwgdHlwZW5hbWUgVD4Kc3RkOjpwYWlyPHR5cGVuYW1lIE1hcDo6aXRlcmF0b3IsIGJvb2w+Cmluc2VydF9vcl9hc3NpZ24oTWFwJiBtLCBjb25zdCB0eXBlbmFtZSBNYXA6OmtleV90eXBlJiBrLCBjb25zdCBUJiB0KQp7CiAgICBhdXRvIHAgPSBtLmluc2VydCh7aywgdH0pOwogICAgaWYgKCFwLnNlY29uZCkgewogICAgICAgIC8vIG92ZXJ3cml0ZSBwcmV2aW91cyB2YWx1ZQogICAgICAgIHAuZmlyc3QtPnNlY29uZCA9IHQ7CiAgICB9CiAgICByZXR1cm4gcDsKfQoKaW50IG1haW4oKSB7CiAgYXV0byBtYXAgPSBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIGludD57eyJmb28iLCAxfSwgeyJiYXIiLCAyfX07CgogIGF1dG8gcCA9IG1hcC5pbnNlcnQoeyJmb28iLCAzfSk7CiAgaWYgKHAuc2Vjb25kKSB7CiAgICAvLyBpdCBoYXMganVzdCBiZWVuIGluc2VydGVkLgogICAgc3RkOjpjb3V0IDw8ICJmb28gd2FzIGluc2VydGVkXG4iOwogIH0gZWxzZSB7CiAgICAvLyBpdCBoYXMgYmVlbiBhc3NpZ25lZAogICAgc3RkOjpjb3V0IDw8ICJmb28gd2FzIGFzc2lnbmVkXG4iOwogIH0KCiAgcCA9IG1hcC5pbnNlcnQoeyJoaSIsIDQyfSk7CiAgaWYgKHAuc2Vjb25kKSB7CiAgICAvLyBpdCBoYXMganVzdCBiZWVuIGluc2VydGVkLgogICAgc3RkOjpjb3V0IDw8ICJoaSB3YXMgaW5zZXJ0ZWRcbiI7CiAgfSBlbHNlIHsKICAgIC8vIGl0IGhhcyBiZWVuIGFzc2lnbmVkCiAgICBzdGQ6OmNvdXQgPDwgImhpIHdhcyBhc3NpZ25lZFxuIjsKICB9Cgp9