5
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);
4

2 回答 2

6

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

Meyers 在他的一本书中也提到了这一点,他说emplace如果你已经有了对象的实例,调用并没有实际的好处。

于 2016-04-22T17:05:16.820 回答
2

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

这里的参考使我相信这种非“谨慎使用”会导致与插入非常相似的机制和性能,其确切细节可能是编译器特定的。

于 2016-04-22T14:49:51.010 回答