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

标签 c++ dictionary stl emplace

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

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

通常我们会做这样的事情:

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));

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

关于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/

相关文章:

list - 从字典中的列表中打印一个单词 (python)

c++ - 如何创建可以参数化的哈希函数?

c++ - STL::map 插入一个带约束的值

C++——在一个类的不同模板化版本之间进行转换的方法

c++ - 没有工厂就无法实例化的参数化工厂和产品类

c++ - 如何在 C/C++ 中使用带有 OpenSSL 的静态链接

c++ - 不使用元素复制赋值运算符复制 vector - 可移植性

c++ - 关于浮点计算的准确度/精度,可以提出什么声明(如果有的话)?

java - 打印作为对象的 TreeMap 值

swift - 如何在 set 方法中快速呈现字典?