【问题标题】:When to use emplace* and when to use push/insert [duplicate]何时使用 emplace* 以及何时使用 push/insert [重复]
【发布时间】:2013-07-27 09:51:48
【问题描述】:

我知道容器上的 emplace 函数的一般概念(“就地构造新元素”)。
我的问题不是它的作用, 但更像是 Effective C++11 之一。

什么是决定何时使用的好规则(例如,当涉及到std::vectoremplace_back() 以及何时使用 push_back() 以及一般 emplace* 与“旧”插入函数?

【问题讨论】:

  • 在不可复制的类型上使用emplace
  • @Rapptz 如果它是不可复制但可移动的,又名 unique_ptr 怎么办?
  • 我的第一个想法是总是使用emplace。我无法立即想到使用push_back 的理由。我一定是忘记了什么
  • @MooingDuck ofc 这是一个合法的可能性......但我宁愿让它在 SO 上得到很好的 A 的祝福,而不是把它从我的愚蠢分析中拉出来
  • @MooingDuck 这个问题明确指出 OP 知道 emplace_back 做了什么。您链接的问题是emplace_back 是做什么的

标签: c++11 stl emplace


【解决方案1】:

emplace_back() 仅在您必须在将对象放入容器之前从头开始构造对象时才真正有意义。如果你给它一个预先构建的对象,它基本上会降级为push_back()。如果对象的复制成本很高,或者您必须在紧密循环中创建大量对象,您通常会看到差异。

我倾向于替换以下代码:

myvector.push_back(ContainedObject(hrmpf));

myvector.emplace_back(hrmpf);

如果前者出现在分析器输出中。对于新代码,如果可以的话,我可能会使用emplace_back(我们在工作中仍然主要使用VS2010,它对emplace_back() 的实现有点步履蹒跚)。

【讨论】:

  • 为什么说emplace_back在其他情况下没有意义?
  • @MooingDuck 因为push_back 已经在右值引用上重载了,所以如果你已经有一个对象,你可以将它移动到向量中,而不是像@987654328 那样就地构造它@会
  • @TemplateRex:啊,你说这没有意义,因为我们已经有了push_back。我会争辩说,emplace_back 总是 是有道理的,而 push_back 已被弃用。
  • @MooingDuck 我要说的是,本质区别在于构建的时刻。如果您不控制对象构造,并且将一堆已经创建的对象存储在容器中,则使用push_back()(您可以复制或移动它们)。如果控制构造,可以直接使用emplace_back()就地构造对象。说 push_back() 已弃用,会将您的设计空间缩小到多层框架(基于网络的消息传递,有人吗?)或多或少被排除在外的地步。
猜你喜欢
  • 1970-01-01
  • 2012-03-26
  • 2014-06-16
  • 2013-04-05
  • 2011-05-04
  • 2019-06-24
  • 2018-04-24
  • 1970-01-01
  • 2016-04-30
相关资源
最近更新 更多