【问题标题】:What is multimap::emplace() and move()?什么是 multimap::emplace() 和 move()?
【发布时间】:2023-03-31 10:17:01
【问题描述】:

我正在查看 MSDN 文档关于 multimap 并发现它有一个成员函数 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(),但我真的不明白它是做什么的(在引擎盖下)。

【问题讨论】:

标签: c++ stl c++11 multimap rvalue-reference


【解决方案1】:

使用向量进行放置更容易理解。 my_vector.emplace_back(1, 2, 3) 基本上是my_vector.push_back(some_type(1, 2, 3)) 的有效快捷方式。现在可以将 any 构造函数用于就地构造,而不是就地复制构造对象,从而节省临时对象的创建、复制(或移动)和销毁。放置由完美转发提供支持。

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

【讨论】:

  • 我相信,my_vector.emplace(1, 2, 3) 应该是 my_vector.emplace_back(1, 2, 3)
  • 这是一个比公认的答案更好的答案,至少它是不准确的并且可以说是错误的。
  • 那么 msdn doc 中没有错字吗?我认为解释 emplace 的更明确的例子是m1.emplace(1, "a"),即emplace 转发参数。在我看来,他们的示例也可以使用 insert 而不是 emplace 编译。
猜你喜欢
  • 1970-01-01
  • 2011-02-20
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多