emplace_back
和 push_back
是 C++ 标准库容器(如 std::vector
、std::list
、std::deque
等)中用于在容器末尾添加元素的方法。它们在功能上类似,但有一些关键的区别:
-
参数传递方式:
push_back
:接受一个已经构造好的元素,然后将其副本插入容器。这意味着在调用push_back
时,需要先构造一个元素,然后将其复制或移动到容器中。emplace_back
:接受构造元素所需的参数,并在容器内部直接构造一个新的元素。这避免了额外的复制或移动操作。
-
构造和移动成本:
push_back
:需要构造一个元素并将其插入容器,可能涉及拷贝或移动构造,因此可能会有额外的性能开销。emplace_back
:直接在容器内部构造元素,避免了额外的构造和移动开销,因此通常比push_back
更高效。
-
代码简洁性:
push_back
:需要先创建一个元素,然后再通过push_back
将其插入,这可能会使代码更冗长。emplace_back
:由于可以直接传递构造参数,代码可能会更加简洁。
-
支持类型:
push_back
:支持传递已经构造好的对象,适用于任何支持拷贝或移动构造的类型。emplace_back
:支持直接在容器内构造对象,适用于任何可构造的类型。
示例代码:
#include <iostream>
#include <vector>
class MyClass {
public:
MyClass(int value) : data(value) {
std::cout << "Constructor" << std::endl;
}
private:
int data;
};
int main() {
std::vector<MyClass> vec;
// 使用 push_back
vec.push_back(MyClass(1));
// 使用 emplace_back
vec.emplace_back(2);
return 0;
}
在这个示例中,使用 push_back
会导致 MyClass
的构造函数被调用两次,因为要先构造一个临时对象,然后将其复制到容器中。而使用 `emplace