我有一个std::map
,我想要插入一个对象,但我想避免不必要的拷贝,因为它是一个大对象,拷贝需要时间。我试过这个:
MyPODType data(otherData);
data.modify();
myMap["Some key"] = data;
但是,这需要两个副本:一个复制otherData
,另一个在赋值操作符中插入对象。因为它是POD,所以复制构造函数和赋值操作符都是默认的。
我怎么能只用一份拷贝就能做到这一点?我意识到一些编译器会优化第二个副本,但是我想以一种可移植的方式来实现。
发布于 2015-02-19 04:28:49
(我假设MyPODType
是您map
的确切value_type
)
正如Igor在评论中指出的那样,由于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
选项看起来更简单。
https://stackoverflow.com/questions/28598239
复制相似问题