C ++在已创建对象时设置emplace vs insert

时间:2016-04-22 14:37:22

标签: c++ insert set emplace

class TestClass {
    public:
     TestClass(string s) {

     }
   };

当有TestClass时,我理解了emplace和insert之间的区别(插入副本时就位构造了构造)

   set<TestClass> test_set;
   test_set.insert(TestClass("d"));
   test_set.emplace("d");

但是,如果已经存在TestClass对象,它们在机制和性能方面有何不同?

   set<TestClass> test_set;
   TestClass tc("e");
   test_set.insert(tc);
   test_set.emplace(tc);

2 个答案:

答案 0 :(得分:5)

emplace通过将其参数完美地转发给正确的构造函数来完成其工作(通过在大多数实现中使用可能的新位置)。 因此,在您的情况下,它转发左值引用,因此它可能会调用复制构造函数 现在与显式调用复制构造函数的push_back的区别是什么?

迈耶斯还在其中一本书中引用了这一点,并且他说如果你已经拥有该对象的实例,那么在调用emplace时没有任何实际的好处。

答案 1 :(得分:2)

  

小心使用emplace可以构建新元素,同时避免不必要的复制或移动操作。调用new元素的构造函数与提供给emplace的参数完全相同,通过std :: forward(args)转发....

参考here让我相信这种非 - &#34;谨慎使用&#34;将导致与插入非常相似的机制和性能,其具体细节可能是编译器特定的。