簡體   English   中英

向向量中插入數據時多次調用復制構造函數

[英]Copy constructor called many times when data is inserted in vector

#include <iostream>
#include <vector>
using namespace std;
class base
{
    int x;
public:
    base(int k){x =k; }
    void display()
    {
        cout<<x<<endl;
    }

    base(const base&)
    {
        cout<<"base copy constructor:"<<endl;
    }
};
int main()
{
    vector<base> v;
    base obase[5]={4,14,19,24,29};
    for(int i=0; i<5; i++)
    {
        v.push_back(obase[i]);
    }

}

將數據插入向量時,使用復制構造函數將數據復制到向量。

當我運行這個程序時,

  1. 對於第一次插入 (i=0),調用一次復制構造函數。
  2. 對於第二次插入(i=1),調用了兩次復制構造函數
  3. 對於第三次插入(i=3),調用了三次復制構造函數
  4. 對於第四次插入(i=3),調用了四次復制構造函數
  5. 對於第五次插入(i=4),調用了五次復制構造函數

請任何人都可以告訴我為什么會這樣? 對於每次插入,不應該只調用一次復制構造函數嗎?

push_back()的調用會根據需要增加向量的大小,這涉及復制向量的內容。 由於您已經知道它將包含五個元素, v.reserve(5); 在循環之前,或使用范圍構造函數:

base obase[5]={4,14,19,24,29};
vector<base> v(obase, obase+5);

您的復制構造函數有缺陷,您忘記實際復制數據:)

base(const base& that) : x(that.x)
{
    cout << "base copy constructor\n";
}

此外,如果你有一個現代編譯器,你可以編寫一個移動構造函數並學習一些新東西:

base(base&& that) : x(that.x)
{
    cout << "base move constructor\n";
}

如果v需要調整其內部緩沖區的大小,它通常會分配一個全新的 memory 區域,因此它需要將之前在向量中的所有對象復制到新位置。 這是使用常規復制完成的,因此調用了復制構造函數。

如果您可以估計需要多少元素,則應該在向量上調用reserve()以預先保留存儲空間。

請注意, std::vector的調整大小/增長行為取決於實現,因此您的代碼示例將使用不同的標准庫實現產生不同的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM