C++ 在已创建对象时设置置入与插入
C++ Set emplace vs insert when an object is already created
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);
emplace
通过将其参数完美地转发到正确的构造函数(通过在大多数实现中使用可能的新位置)来完成它的工作。
因此,在您的情况下,它会转发一个左值引用,因此它可能会调用复制构造函数。
现在与显式调用复制构造函数的push_back
有什么区别?
迈耶斯在他的一本书中也引用了这一点,他说,如果你已经有一个对象的实例,那么调用emplace
就没有实际的好处。
小心使用emplace允许构建新元素,同时避免不必要的复制或移动操作。新元素的构造函数被调用,参数与提供给 emplace 的参数完全相同,通过 std::forward(args)转发。
这里的参考使我相信,这种非"谨慎使用"将导致与插入非常相似的机制和性能,其确切细节可能是特定于编译器的。
相关文章:
- 无法在构造函数中执行设置元素插入
- std::为插入和排序设置不同的比较器
- 设置诊断:插入符号来自 CMakeLists.txt
- 当我添加自定义比较器时,无法插入新元素以设置
- 插入要设置的矢量项
- STD上的SEG故障::设置整数插入
- 在将结构插入设置C++时遇到问题
- 插入函数中的迭代器设置
- c++设置了保持插入顺序的数据结构
- 重载C++设置插入
- C++ 在已创建对象时设置置入与插入
- 插入对象以设置c++
- 为什么插入会使标准::设置反向迭代器无效
- c++ 设置插入编号以检查重复项
- 只是尝试插入一个节点并将指针设置为下一个节点C++
- 标准::设置:<T>:插入,重复元素
- 字符串流插入器是否使用当前区域设置
- 在 map<int 中插入,设置<int>>
- 设置检测插入故障
- 设置插入在以下情况下如何工作