假設我要表示的int
二維矩陣爲向量的向量:矢量矢量,儲備
std::vector<std::vector<int> > myVec;
內部尺寸是恆定的,比如5,且外尺寸小於或等於N
。爲了最大限度地減少重新分配,我想預留空間:
myVec.reserve(N);
假定內部矢量的大小是多少?這是純粹的實現依賴嗎?這如何影響數據的空間局部性?由於內部維度是一個常量,有沒有辦法告訴編譯器使用這個常量大小?如果內部向量的大小發生變化,這些答案如何改變?
假設我要表示的int
二維矩陣爲向量的向量:矢量矢量,儲備
std::vector<std::vector<int> > myVec;
內部尺寸是恆定的,比如5,且外尺寸小於或等於N
。爲了最大限度地減少重新分配,我想預留空間:
myVec.reserve(N);
假定內部矢量的大小是多少?這是純粹的實現依賴嗎?這如何影響數據的空間局部性?由於內部維度是一個常量,有沒有辦法告訴編譯器使用這個常量大小?如果內部向量的大小發生變化,這些答案如何改變?
由於您的內部尺寸是固定的,我想你想
std::vector< std::array<int, 5> > vecs;
vecs.reserve(N);
這會給你預分配連續的存儲,這是最佳的性能。
只適用於C++ 11,請說明。 –
@Samer:這是無稽之談,'array'不需要任何C++ 11的特性,並且自2007年以來可以用'std :: tr1 :: array',甚至在'boost :: array'之前。 –
內部矢量的大小與調整外部矢量的大小完全無關。對於您的矢量包沒有局部保證,局部性保證(即內存中的連續塊)僅存在於單個矢量。
請記住,矢量對象本身具有常量sizeof
-size,其實際數據通常是動態分配的。首先逼近的外部矢量是一個連續的N'指向內部向量的塊。您的reserve
調用不會爲內部向量的可能元素保留內存,但僅針對內部向量對象本身(即其簿記數據及其指向其動態分配的數據塊的指針)。
內部向量用默認構造函數初始化。所以,如果你寫:
vector<vector<int> > vecs;
vecs.reserve(10);
這等同於調用的vector<int>
或vector<int>()
每個元素的constuctor。這意味着你將有一個零大小的向量。但請記住,除非調整大小(不保留)矢量,否則不能使用它們。
請記住,有時可能更有效地調整您需要的初始大小。因此,它是有用的像做
vector<vector<int> > vecs(3,vector<int>(5));
這將創建一個大小爲3的向量,每個元素將包含大小的矢量5
也請記住,這可能是更有效地使用雙端隊列而不是向量,如果你要經常調整矢量大小。它們易於使用(作爲向量),並且不需要預留,因爲元素在內存中不是連續的。
二維矩陣很可能用於隨機訪問,而'deque'不能有效地執行。 –
矢量矢量並不是表示矩形矩陣的特別好方法。這對鋸齒狀數組更有用,其中每行的列數不同。 –