我有一个std::map
我想插入一个对象,但我想避免不必要的副本,因为它是一个大对象,副本需要时间。
我试过这个:
MyPODType data(otherData);
data.modify();
myMap["Some key"] = data;
但是这需要2个副本:一个用于复制otherData
,另一个用于分配操作符以插入对象。由于它是POD,因此复制构造函数和赋值运算符都是默认值。
如何只使用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
选项似乎更简单。