push_back
和 emplace_back
都是 C++ 標(biāo)準(zhǔn)庫(kù)中容器(如 vector、list 等)的成員函數(shù),用于在容器末尾添加元素。但它們之間有一些重要的區(qū)別:
參數(shù):
push_back
需要一個(gè)已經(jīng)構(gòu)造好的對(duì)象作為參數(shù),然后將這個(gè)對(duì)象復(fù)制或移動(dòng)到容器的末尾。emplace_back
則直接在容器的末尾構(gòu)造一個(gè)新的對(duì)象,它接受與對(duì)象構(gòu)造函數(shù)相匹配的參數(shù)。性能:
push_back
時(shí),如果對(duì)象已經(jīng)存在,那么可能會(huì)涉及到額外的復(fù)制或移動(dòng)操作,這可能會(huì)影響性能。emplace_back
時(shí),由于對(duì)象是直接在容器內(nèi)構(gòu)造的,因此通??梢蕴峁└玫男阅埽貏e是對(duì)于大型對(duì)象或者需要復(fù)雜構(gòu)造過(guò)程的對(duì)象。適用場(chǎng)景:
push_back
是合適的。emplace_back
是更好的選擇。下面是一個(gè)簡(jiǎn)單的示例,展示了 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,先創(chuàng)建一個(gè)對(duì)象,然后復(fù)制到容器中
MyClass obj(1, 2);
vec.push_back(obj);
// 使用 emplace_back,直接在容器中構(gòu)造對(duì)象
vec.emplace_back(3, 4);
return 0;
}
在這個(gè)示例中,MyClass
是一個(gè)簡(jiǎn)單的類,它有一個(gè)接受兩個(gè)整數(shù)參數(shù)的構(gòu)造函數(shù)。在 main
函數(shù)中,我們創(chuàng)建了一個(gè) std::vector<MyClass>
容器,并使用 push_back
和 emplace_back
向其添加元素。注意,當(dāng)使用 emplace_back
時(shí),我們沒(méi)有先創(chuàng)建一個(gè) MyClass
對(duì)象,而是直接傳遞了構(gòu)造函數(shù)所需的參數(shù)。