[英]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]);
}
}
將數據插入向量時,使用復制構造函數將數據復制到向量。
當我運行這個程序時,
請任何人都可以告訴我為什么會這樣? 對於每次插入,不應該只調用一次復制構造函數嗎?
對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.