调用std :: map :: emplace()并避免不必要的构造

时间:2013-12-29 21:40:29

标签: c++ c++11

我有一个std::map,其键为std::string,值是我自己定义的类型。

假设我有以下代码:

std::map<std::string, MyType> mymap;
std::string str1("test");
MyType value(pars); //I want value to be moved

mymap.emplace(std::make_pair(str1, std::move(value))); //A
mymap.emplace(str, std::move(value)); //B

假设std::map存储对,我猜A会生成对std::pair构造函数(make_pair)的进一步调用,然后再调用std::pair移动构造函数(在 - 用rvalue参数放置构造。)

我认为B只会调用std::pair构造函数。

为了避免不必要的构造,我们可以说B优于A吗?

1 个答案:

答案 0 :(得分:1)

根据http://www.cplusplus.com/reference/map/map/emplace/

  

如果新元素的键是唯一的,则在地图中插入新元素。使用args作为构造value_type(它是对类型的对象)的参数来构造这个新元素......通过调用带有args转发的allocator_traits :: construct来就地构造元素。

因此,在选项A中,您首先构造一对emplace将转发给pair的构造函数(作为右值),然后执行移动构造。

选项B转发str并将std::move(value)返回给构造函数以进行配对。

所以是的,选项A构造2对,而选项B只构造1。