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 值来检查是否发生了插入或赋值。
这一定是重复的...如果是,请帮我找到,否则...求助。
我正在尝试更新映射中的条目,其中映射类型没有默认构造函数(并且可能没有复制构造函数)。
通常我们会这样做:
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));
您还可以使用 return 值来检查是否发生了插入或赋值。