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);
答案 0 :(得分:5)
emplace
通过将其参数完美地转发给正确的构造函数来完成其工作(通过在大多数实现中使用可能的新位置)。
因此,在您的情况下,它转发左值引用,因此它可能会调用复制构造函数
现在与显式调用复制构造函数的push_back
的区别是什么?
迈耶斯还在其中一本书中引用了这一点,并且他说如果你已经拥有该对象的实例,那么在调用emplace
时没有任何实际的好处。
答案 1 :(得分:2)
小心使用emplace可以构建新元素,同时避免不必要的复制或移动操作。调用new元素的构造函数与提供给emplace的参数完全相同,通过std :: forward(args)转发....
参考here让我相信这种非 - &#34;谨慎使用&#34;将导致与插入非常相似的机制和性能,其具体细节可能是编译器特定的。