2011-09-14 32 views
6

我試圖以下代碼:vector.resize()方法在調整大小時調用默認元素構造函數嗎?

struct _Struct2 
{ 
    void *ptr; 
    double dval; 
}; 

struct _Struct 
{ 
    float fval; 
    int ival; 
    std::vector<_Struct2> data; 
}; 

std::vector<_Struct> vec; 


int main() 
{ 
    vec.resize(9); 
    for (int i = 0; i < vec.size(); i++) 
    { 
     _Struct &elem = vec[i]; 
     int  len = elem.data.size(); // elem.data is [0]() 
    } 
} 

調整大小(9)應分配類型_Struct的9個元素。而且,實際上它很有用。但是_Struct類型的每個元素都沒有被初始化,特別是數據元素,這是另一個std :: vector。我希望它被初始化爲空的std :: vector。必須手動執行此操作嗎?我認爲resize()方法會調用每個_Struct元素的默認構造函數。 Thx

Ps。 這裏使用的結構名稱只是我想到的第一件事情。這只是一個例子。我的Visual Studio告訴我,elem.data在調試視圖中對應於[0]()

Ps。 忘記[0]()

+4

以下劃線和大寫字母開頭的標識符被保留用於實現。 –

+3

我無法想象'len = elem.data.size()'不會崩潰,如果某種方式'data'沒有被初始化(它肯定應該是)。 「數據」究竟是什麼,你期望在那裏有什麼? – Jon

+1

向量中的元素是在「resize」上默認構造的(對於這個結果爲0的整數)對於您的自定義類,您應該定義自己的默認構造函數。 –

回答

16

不,它不調用默認元素構造函數。從不在內部調用默認的構造函數(它在C++ 11中執行,但在規範的早期版本中不執行)。

vector::resize完整的簽名如下所示

void resize(size_type sz, T c = T()); 

即它有第二個參數(帶有默認參數值)。然後第二個參數用作「源」對象來初始化新元素複製構造函數

換句話說,你要resize通話實際上相當於

vec.resize(9, _Struct()); 

這意味着它是當你提供的是「源」對象vector::resize誰調用默認的構造函數,即使你沒沒有注意到這一點。

但是類型_Struct的每一個元素不被初始化,尤其是 數據元素,這是另一種的std ::向量。

咦? 「未初始化」?我不知道這應該是什麼意思,因爲在示例代碼中,由resize創建的每個新元素都按上述方式完全初始化:它是從作爲第二個參數隱式提供給resize_Struct()元素進行復制初始化的。每個_Struct::fval_Struct::ival爲零,並且每個_Struct::data是空向量。

(在原始的C++ 98 _Struct::fval_Struct::ival將保持未初始化,因爲預TC1 C++ 98不支持值初始化,但_Struct::data甚至會在原來被初始化爲空載體C++ 98)。

我希望它被初始化爲空的std :: vector。

每個_Struct::data矢量已被初始化爲空向量。是什麼讓你相信它不是?

P.S.名稱以_開頭,後跟一個大寫字母由實現保留。你不能使用它們。

+0

C++ 11是否添加了'resize'的版本化版本? –

+0

@Kerrek SB:我沒有看到一個版本的版本,但是C++ 11並沒有將vector :: resize分成兩個函數:1)size和2)size和「source」對象。第一個版本現在在內部執行值初始化,這意味着我的答案對C++ 11來說並不完全準確(即使最終結果是相同的) – AnT