这一定是重复的...如果是这样,请帮我找到,否则...帮助。
我正在尝试更新映射中的条目,其中映射类型没有默认构造函数(可能也没有复制构造函数)。
通常我们会做这样的事情:
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
std::map<K, V> myMap;
myMap.insert_or_assign(myKey, myMappedTypeInstance);
第二个参数已完美转发,因此为了避免复制,您可能需要
myMap.insert_or_assign(myKey, std::move(myMappedTypeInstance));
您还可以使用返回值来检查是否发生了插入或赋值。
关于C++ 映射和 unordered_map : emplace to do an upsert/update/replace (for case where value type has no default-constructor)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67803479/