C++ - 直接插入 std::map 而不使用赋值运算符

Dre*_*rew 2 c++ stdmap copy-constructor assignment-operator c++11

std::map想在其中插入一个对象,但我想避免不必要的复制,因为它是一个大对象,并且复制需要时间。我试过这个:

MyPODType data(otherData);
data.modify();
myMap["Some key"] = data;
Run Code Online (Sandbox Code Playgroud)

然而,这需要 2 个副本:一份用于复制otherData,一份在赋值运算符中用于插入对象。由于是POD,复制构造函数和赋值运算符都是默认的。

我怎样才能只用一份副本来做到这一点?我意识到一些编译器会优化第二个副本,但我想以可移植的方式做到这一点。

M.M*_*M.M 5

(我假设MyPODTypevalue_type你的map

正如 Igor Tandetnik 在评论中指出的,从 C++11 开始你可以写:

myMap.emplace("Some key", otherData);
Run Code Online (Sandbox Code Playgroud)

然后您可以modify()在地图中调用该值。

emplace函数将使用完美转发将参数分别转发到键和值的构造函数,而不必创建临时std::pair或默认构造值。

也可以使用insert

std::pair<KeyType, MyPODType> p = { "Some key ", otherData };
p.second.modify();
myMap.insert( std::move(p) );
Run Code Online (Sandbox Code Playgroud)

尽管这个emplace选项看起来更简单。