2012-05-07 32 views
0

假設我需要一個未定數的3乘4矩陣。 (或者任何其他固定的m×n維矩陣的序列)。我的第一個想法是將這些矩陣存儲在std::vector中,其中每個矩陣本身是std::vector<std::vector<double> >。如何使用std::vector::reserve()爲這些矩陣的數字預先分配空間,如x?因爲我知道兩個維度,我應該(或者我希望)能夠將這些塊的大小設置爲x倍。保存「塊」的C++ 3D向量

我知道如何在一維std::vector實現這個目標,但我想知道如何做一個3D std::vector,如果沒有其他原因,而不是更好地學習如何使用std::vector類。

+0

沒有'preserve'這樣的東西。 –

+0

你的意思是'reserve()','preserve'不存在像Kerrek SB所說的 – EdChum

+0

對不起,是的,我的意思是「保留」而不是「保留」。 :) – synaptik

回答

0

一種更好的方法是提供一類界面,並使用存儲器的單個線性塊爲整個矩陣。然後可以以不同方式實現,從適當的大小(如果該尺寸的大小的一部分),或通過提供索引(pos = row*cols + col)的單個std::vector<int>的內部數組範圍的接口。

std::vector< std::vector<int> >接近外向量將分配存儲器來存儲所述內矢量,並且這些中的每一個將分配存儲器來保持它自己的元件。使用原始指針,它是在存儲器佈局的類似:

int **array = new int*[ N ]; 
for (int i = 0; i < N; ++i) 
    array[i] = new int[ M ]; 

即:

[ 0 ] -------> [ 0, 1, 2, ... ] 
[---] 
[ 1 ] -------> [ 0, 1, 2, ... ] 
[ . ] 
[ . ] 

或者基本上N + 1個的存儲器的單獨塊。

1

存儲矩陣作爲載體-的向量可能是非常低效的,但如果你一定要,去了。預留空間是一樣的始終:

typedef std::vector<std::vector<int>> matrix_type; 

std::vector<matrix_type> collection; 

collection.reserve(100); // set capacity for 100 "matrices" 

// make 10 4x3-matrices; `collection` won't reallocate 
collection.resize(10, matrix_type(4, std::vector<int>(3))); 

爲了您的基本類型,你可能是最好有m * n元素的一個載體和訪問它的進步,即(I,J)元素將在位置i * n + j。每個矢量本身都是一個動態容器,你可能不希望所有的地方都有那麼多的動態分配。

本着同樣的精神,上述reserve通話可能不會做你認爲,因爲它僅保留存儲器內矢量的簿記數據(每載體通常三個字,即300個字以內),並爲實際的數據。

鑑於這種情況,你甚至可能要考慮的std::array<int, m*n>爲您的矩陣型(和訪問它在進步);現在你可以實際上實際矩陣的前期預留空間 - 但mn現在必須編譯時間常數。

+0

非常感謝。這非常有幫助。我非常喜歡使用'std :: array'作爲矩陣類型的想法。 – synaptik