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
對象,而是直接傳遞了構造函數所需的參數。