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

11
我在查看有关 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()的内容,但我真的不明白它在内部执行什么操作。


2
我建议你阅读:https://dev59.com/E2855IYBdhLWcg3wg0nC - Arzar
1个回答

16

使用向量更容易理解emplace的概念。 my_vector.emplace_back(1, 2, 3) 基本上是一个高效的快捷方式,用于 my_vector.push_back(some_type(1, 2, 3))。与就地复制构造对象不同,现在可以使用任何构造函数进行就地构造,从而节省了创建、复制(或移动)和销毁临时对象的时间。emplace是由完美转发支持的。

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


我相信,应该使用my_vector.emplace_back(1, 2, 3)而不是my_vector.emplace(1, 2, 3) - UmmaGumma
4
这个回答比被接受的回答更好,至少在准确性方面存在问题,甚至可以说是错误的。 - Howard Hinnant
那么 MSDN 文档中不是有一个错别字吗?我认为更明确的例子来解释 emplace 应该是 m1.emplace(1, "a"),即 emplace 转发参数。在我看来,他们的例子使用 insert 代替 emplace 也可以编译通过。 - rafak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接