1. 程式人生 > 實用技巧 >(轉載)emplace_back()和push_back()的區別

(轉載)emplace_back()和push_back()的區別

C++ STL vector新增元素(push_back()和emplace_back())詳解 (biancheng.net)

總結:由此可以看出,push_back() 在底層實現時,會優先選擇呼叫移動建構函式,如果沒有才會呼叫拷貝建構函式。
顯然完成同樣的操作,push_back() 的底層實現過程比 emplace_back() 更繁瑣,換句話說,emplace_back() 的執行效率比 push_back() 高。因此,在實際使用時,建議大家優先選用 emplace_back()。

emplace_back() 和 push_back() 的區別,就在於底層實現的機制不同。push_back() 向容器尾部新增元素時,首先會建立這個元素,然後再將這個元素拷貝或者移動到容器中(如果是拷貝的話,事後會自行銷燬先前建立的這個元素);而 emplace_back() 在實現時,則是直接在容器尾部建立這個元素,省去了拷貝或移動元素的過程。

為了讓大家清楚的瞭解它們之間的區別,我們建立一個包含類物件的 vector 容器,如下所示:

#include <vector> 
#include <iostream> 
using namespace std;
class testDemo
{
public:
    testDemo(int num):num(num){
        std::cout << "呼叫建構函式" << endl;
    }
    testDemo(const testDemo& other) :num(other.num) {
        std::cout << "呼叫拷貝建構函式" << endl;
    }
    testDemo(testDemo
&& other) :num(other.num) { std::cout << "呼叫移動建構函式" << endl; } private: int num; }; int main() { cout << "emplace_back:" << endl; std::vector<testDemo> demo1; demo1.emplace_back(2); cout << "push_back:" << endl; std::vector
<testDemo> demo2; demo2.push_back(2); }

執行結果為:

emplace_back:
呼叫建構函式
push_back:
呼叫建構函式
呼叫移動建構函式

在此基礎上,讀者可嘗試將 testDemo 類中的移動建構函式註釋掉,再執行程式會發現,執行結果變為:

emplace_back:
呼叫建構函式
push_back:
呼叫建構函式
呼叫拷貝建構函式

由此可以看出,push_back() 在底層實現時,會優先選擇呼叫移動建構函式,如果沒有才會呼叫拷貝建構函式。
顯然完成同樣的操作,push_back() 的底層實現過程比 emplace_back() 更繁瑣,換句話說,emplace_back() 的執行效率比 push_back() 高。因此,在實際使用時,建議大家優先選用 emplace_back()。