首頁  >  文章  >  後端開發  >  為什麼在「vector」上使用「push_back()」時,「Myint」物件的複製建構子會被多次呼叫?

為什麼在「vector」上使用「push_back()」時,「Myint」物件的複製建構子會被多次呼叫?

Susan Sarandon
Susan Sarandon原創
2024-10-31 10:58:02412瀏覽

Why does the copy constructor of a `Myint` object get invoked multiple times when using `push_back()` on a `vector`?

Vector 的Push_back 操作期間多次呼叫複製建構子

在C 中,當使用push_back() 方法將元素加入向量時,通常會使用該元素類型的複製構造函數。但是,在某些情況下,可能會觀察到複製構造函數的多次呼叫。

考慮以下程式碼片段:

<code class="cpp">class Myint {
  private:
    int my_int;

  public:
    Myint() : my_int(0) {
        cout << "Inside default " << endl;
    }

    Myint(const Myint& x) : my_int(x.my_int) {
        cout << "Inside copy with my_int = " << x.my_int << endl;
    }

    void set(const int& x) {
        my_int = x;
    }
};

vector<Myint> myints;
Myint x;

myints.push_back(x);
x.set(1);
myints.push_back(x);</code>

執行此程式碼時,會產生以下輸出:

Inside default
Inside copy with my_int = 0
Inside copy with my_int = 0
Inside copy with my_int = 1

此輸出顯示複製建構函式被呼叫四次,而不是預期的兩次。造成這種行為的原因在於向量記憶體管理的內部運作原理。

當已達到其內部容量的向量呼叫push_back()時,必須重新分配該向量以容納新元素。在此重新分配期間,現有元素將複製到新的記憶體位置。此過程會導致為每個元素額外呼叫複製建構函式。

為了避免這種多次複製行為,可以採取一些措施:

  • 保留足夠的容量: 透過呼叫向量上的Reserve() 方法,可以提前增加內部容量,從而無需重新分配。
  • 使用 emplace_back(): 此方法允許直接建構向量內的元素,無需複製。

透過採用這種技術,可以最大限度地減少不必要的複製構造函數調用,從而提高向量運算的效率。

以上是為什麼在「vector」上使用「push_back()」時,「Myint」物件的複製建構子會被多次呼叫?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn