问题 什么是multimap :: emplace()和move()?


我正在查看有关multimap的MSDN文档,并发现它有一个成员函数multimap :: emplace()。以下是该成员函数的示例。

int main( ) {
   using namespace std;
   multimap<int, string> m1;
   pair<int, string> is1(1, "a");

   m1.emplace(move(is1));
}

看起来 emplace() 和 move() 是C ++ 0x。有人可以帮我解释一下吗?我读到了 move(),但我真的不明白它做了什么(引擎盖下)。


9227
2018-03-29 07:58


起源

我建议你阅读: stackoverflow.com/questions/4303513/push-back-vs-emplace-back - Thomas Petit


答案:


使用向量更容易理解安置。 my_vector.emplace_back(1, 2, 3) 基本上是一个有效的捷径 my_vector.push_back(some_type(1, 2, 3))。而不是就地复制对象, 任何 构造函数现在可以用于就地构造,从而节省临时对象的创建,复制(或移动)和销毁。安抚是由 完美转发

std::move(expression) 基本上是演员 x值,它有效地允许整个表达式绑定到右值引用。您通常这样做是为了从您不再感兴趣的命名对象启用资源窃取,因为它们很快就会被销毁。


16
2018-03-29 10:06



我相信,相反 my_vector.emplace(1, 2, 3) 应该 my_vector.emplace_back(1, 2, 3) - UmmaGumma
这是一个比接受的答案更好的答案,至少是不准确的,可以说是错误的。 - Howard Hinnant
@Ashot:谢谢! - fredoverflow
那么msdn doc中是不是有拼写错误?我认为解释一个更为明确的例子就是 m1.emplace(1, "a"),即 emplace 转发论点。在我看来,他们的例子也可以编译 insert 代替 emplace。 - rafak