阅读量:0
push_back
和 emplace_back
都是 C++ 标准库中容器(如 vector、list 等)的成员函数,用于在容器末尾添加元素。但它们之间有一些重要的区别:
参数:
push_back
需要一个已经构造好的对象作为参数,然后将这个对象复制或移动到容器的末尾。emplace_back
则直接在容器的末尾构造一个新的对象,它接受与对象构造函数相匹配的参数。
性能:
- 使用
push_back
时,如果对象已经存在,那么可能会涉及到额外的复制或移动操作,这可能会影响性能。 - 使用
emplace_back
时,由于对象是直接在容器内构造的,因此通常可以提供更好的性能,特别是对于大型对象或者需要复杂构造过程的对象。
- 使用
适用场景:
- 如果你已经有了一个构造好的对象,并且想将其添加到容器中,那么使用
push_back
是合适的。 - 如果你想直接在容器中构造一个新的对象,并且不需要先创建一个临时对象,那么使用
emplace_back
是更好的选择。
- 如果你已经有了一个构造好的对象,并且想将其添加到容器中,那么使用
下面是一个简单的示例,展示了 push_back
和 emplace_back
的用法:
#include<iostream> #include<vector> class MyClass { public: MyClass(int x, int y) : x_(x), y_(y) { std::cout << "MyClass constructed with (" << x_ << ", " << y_ << ")\n"; } private: int x_; int y_; }; int main() { std::vector<MyClass> vec; // 使用 push_back,先创建一个对象,然后复制到容器中 MyClass obj(1, 2); vec.push_back(obj); // 使用 emplace_back,直接在容器中构造对象 vec.emplace_back(3, 4); return 0; }
在这个示例中,MyClass
是一个简单的类,它有一个接受两个整数参数的构造函数。在 main
函数中,我们创建了一个 std::vector<MyClass>
容器,并使用 push_back
和 emplace_back
向其添加元素。注意,当使用 emplace_back
时,我们没有先创建一个 MyClass
对象,而是直接传递了构造函数所需的参数。