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

时间:2015-02-19 03:41:34

标签: c++ c++11 copy-constructor assignment-operator stdmap

我有一个std::map我想插入一个对象,但我想避免不必要的副本,因为它是一个大对象,副本需要时间。 我试过这个:

MyPODType data(otherData);
data.modify();
myMap["Some key"] = data;

但是这需要2个副本:一个用于复制otherData,另一个用于分配操作符以插入对象。由于它是POD,因此复制构造函数和赋值运算符都是默认值。

如何只使用1份副本?我意识到一些编译器会优化第二个副本,但我想以便携的方式做到这一点。

1 个答案:

答案 0 :(得分:4)

(我假设MyPODType是您value_type的确切map

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

myMap.emplace("Some key", otherData);

然后您可以在地图上的值上调用modify()

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

也可以使用insert

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

虽然emplace选项似乎更简单。