2013-09-24 174 views
11

假設我要表示的int二維矩陣爲向量的向量:矢量矢量,儲備

std::vector<std::vector<int> > myVec; 

內部尺寸是恆定的,比如5,且外尺寸小於或等於N。爲了最大限度地減少重新分配,我想預留空間:

myVec.reserve(N); 

假定內部矢量的大小是多少?這是純粹的實現依賴嗎?這如何影響數據的空間局部性?由於內部維度是一個常量,有沒有辦法告訴編譯器使用這個常量大小?如果內部向量的大小發生變化,這些答案如何改變?

+1

矢量矢量並不是表示矩形矩陣的特別好方法。這對鋸齒狀數組更有用,其中每行的列數不同。 –

回答

5

由於您的內部尺寸是固定的,我想你想

std::vector< std::array<int, 5> > vecs; 
vecs.reserve(N); 

這會給你預分配連續的存儲,這是最佳的性能。

+1

只適用於C++ 11,請說明。 –

+0

@Samer:這是無稽之談,'array'不需要任何C++ 11的特性,並且自2007年以來可以用'std :: tr1 :: array',甚至在'boost :: array'之前。 –

3

內部矢量的大小與調整外部矢量的大小完全無關。對於您的矢量包沒有局部保證,局部性保證(即內存中的連續塊)僅存在於單個矢量。

請記住,矢量對象本身具有常量sizeof -size,其實際數據通常是動態分配的。首先逼近的外部矢量是一個連續的N'指向內部向量的塊。您的reserve調用不會爲內部向量的可能元素保留內存,但僅針對內部向量對象本身(即其簿記數據及其指向其動態分配的數據塊的指針)。

1

內部向量用默認構造函數初始化。所以,如果你寫:

vector<vector<int> > vecs; 
vecs.reserve(10); 

這等同於調用的vector<int>vector<int>()每個元素的constuctor。這意味着你將有一個零大小的向量。但請記住,除非調整大小(不保留)矢量,否則不能使用它們。

請記住,有時可能更有效地調整您需要的初始大小。因此,它是有用的像做

vector<vector<int> > vecs(3,vector<int>(5)); 

這將創建一個大小爲3的向量,每個元素將包含大小的矢量5

也請記住,這可能是更有效地使用雙端隊列而不是向量,如果你要經常調整矢量大小。它們易於使用(作爲向量),並且不需要預留,因爲元素在內存中不是連續的。

+0

二維矩陣很可能用於隨機訪問,而'deque'不能有效地執行。 –