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
对象,而是直接传递了构造函数所需的参数。