【问题标题】:C++ Set emplace vs insert when an object is already createdC++ 在已经创建对象时设置 emplace 与插入
【发布时间】:2016-08-16 06:06:43
【问题描述】:
class TestClass {
    public:
     TestClass(string s) {

     }
   };

当有TestClass时,我明白emplace和insert之间的区别(插入副本时emplace结构就位)

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

【问题讨论】:

    标签: c++ insert set emplace


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-05
        • 1970-01-01
        • 1970-01-01
        • 2014-05-05
        • 1970-01-01
        • 2014-12-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多