#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";
  }

}