2015-10-05 52 views
0

在稱爲ClassA的C++類,我以前稱爲ClassB的另一類型雙維陣列的屬性:如何處理矢量屬性的矢量?

私人: ClassB的矩陣[ROWS] [COLS];

其中ROWS和COLS所在的靜態值。

我現在正在修改應用程序,以便能夠在命令行上指定兩個維度。我正在考慮改用vector<vector<ClassB>>。在轉向此解決方案之前,我想知道默認情況下如何初始化這樣的對象。 vector屬性被自動分配,但嵌套向量會發生什麼?我應該自己分配嗎?

注:我無法找到這個問題的答案,所以請讓我知道它是否是重複的。

+0

請注意,更好的解決方案可能是使用單個矢量編寫2D矩陣類進行存儲。 – juanchopanza

回答

2

默認構造函數std::vector<std::vector>將構造向量的向量,但絕對不會爲其元素(在本例中爲內部向量)分配內存,除非您明確地這樣說。如果您需要分配對應於ROWS x COLS的內存,請使用例如

std::vector<std::vector<int>> vec(ROWS, std::vector<int>(COLS)); 

如果只是說

std::vector<std::vector<int>> vec(ROWS); 

然後外矢量將是缺省構造的,因此沒有存儲器將被分配用於內載體,以及你必須手動儲備ROWS元件每一個或push_back進入他們。

std::vector的構造函數在其所有的光榮here中定義。

但是一般來說,使用嵌套向量是一個壞主意,因爲你失去了數據的局部性,代碼可能會變慢。換句話說,不能保證數據在內存中是連續的。 A vector<vector>將內部數據存儲爲指針數組,並且指針連續存儲時,它們指向的每個數據塊不保證在內存中相鄰。最好使用「平坦」矢量並將其從2D轉換爲1D,反之亦然。

+0

請注意,如果'T'比'int'更復雜,那麼'T'的構造函數將被調用。 – Zereges

+0

@Zereges是的,元素的默認構造函數被調用。 – vsoftco

+0

感謝您提供非常快速的答案。我應該在我的ClassA的構造函數中執行你提到的分配嗎?即使嵌套向量大小爲0,T構造函數也會被調用嗎? –