c++中push_back函數(shù)與emplace_back的區(qū)別

c++
小樊
112
2024-09-16 16:04:07

push_backemplace_back 都是 C++ 標(biāo)準(zhǔn)庫(kù)中容器(如 vector、list 等)的成員函數(shù),用于在容器末尾添加元素。但它們之間有一些重要的區(qū)別:

  1. 參數(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ù)。
  2. 性能

    • 使用 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ì)象。
  3. 適用場(chǎng)景

    • 如果你已經(jīng)有了一個(gè)構(gòu)造好的對(duì)象,并且想將其添加到容器中,那么使用 push_back 是合適的。
    • 如果你想直接在容器中構(gòu)造一個(gè)新的對(duì)象,并且不需要先創(chuàng)建一個(gè)臨時(shí)對(duì)象,那么使用 emplace_back 是更好的選擇。

下面是一個(gè)簡(jiǎn)單的示例,展示了 push_backemplace_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_backemplace_back 向其添加元素。注意,當(dāng)使用 emplace_back 時(shí),我們沒(méi)有先創(chuàng)建一個(gè) MyClass 對(duì)象,而是直接傳遞了構(gòu)造函數(shù)所需的參數(shù)。

0

<var id="0glqq"></var>
      1.