C++ 映射和 unordered_map:放置一个 upsert/update/replace(对于值类型没有默认构造函数的情况)?

C++ map and unordered_map: emplace to do an upsert/update/replace (for case where value type has no default-constructor)?

这一定是重复的...如果是,请帮我找到,否则...求助。

我正在尝试更新映射中的条目,其中映射类型没有默认构造函数(并且可能没有复制构造函数)。

通常我们会这样做:

std::map<K, V> myMap;
myMap[k] = V(...);

但是,对于类型 V 没有默认 c'tor 的情况,我们可能更喜欢:

std::map<K, V> myMap;
myMap.emplace(k, arg_for_v);

不幸的是,如果我们想替换 k 的条目,我们不能使用第一种语法 (operator[]),因为这需要 V.

的默认构造

这是最好的尝试吗?:

std::map<K, V> myMap;
myMap.erase(k);
myMap.emplace(k, arg_for_v);

当你可以使用C++17时,还有`std::map::insert_or_assign,你可以如下使用。

std::map<K, V> myMap;

myMap.insert_or_assign(myKey, myMappedTypeInstance);

第二个参数被完美转发,所以为了避免复制,你可能想要

myMap.insert_or_assign(myKey, std::move(myMappedTypeInstance));

您还可以使用 return 值来检查是否发生了插入或赋值。