2012-12-03 43 views
0

我正在嘗試創建一個多維數組,其大小由用戶提供。用於多維數組的常量

到目前爲止,我有這樣的:

int definedgroups; // for number of groups needed 

cout << "Enter the Number of Groups you require: " << endl; 
cin >> definedgroups; 
const int definedgroups = definedgroups; 

int User_Groups [definedgroups] [4]; 

相信陣列需要不斷的價值觀,所以我想我的指定變量作爲常量,但仍然沒有運氣。

+0

「常量值」是指數組中的值不能更改嗎? – 0x499602D2

+0

是的,但在開始時我希望它由用戶定義 – lecardo

回答

1

在C++中使用靜態數組是不可能的。使用std::vector以層級方式(即向量的向量)來容易地實現多維陣列(雖然不一定非常有效)。

E.g.

std::vector<std::vector<double> > array(nrows, std::vector<double>(ncols));

創建nrows X ncols矩陣。

+0

'std :: vector >'在這種情況下會更好 – Pubby

0

需要使用new動態存儲器分配:

int **User_Groups = new int*[definedgroups]; 
//Allocate memory for 2nd dimension 
for (int i = 0; i < 4; ++i) 
    User_Groups[i] = new int[4]; 
+0

因爲要在運行時指定數組大小,您需要在堆上分配內存。你不能在堆棧上做到這一點。 –

3

在C++中,靜態陣列,也就是那些這樣定義:

foo arrayStatic[bar]; 

要求bar爲恆定整數。換句話說,程序員需要事先知道它的價值。

只要bar未知,就可以使用動態陣列。它們的定義如下:

foo* arrayDynamic; 
arrayDynamic = new foo[bar]; 

這裏,bar可能是一個整數變量。

不要忘記,動態內存最終必須解除分配。因此,在這種情況下,我們可以解除分配arrayDynamic這樣的:

delete [] arrayDynamic; 

二維動態陣列被類似地定義:

foo** arrayDynamic2D; 
arrayDynamic2D = new foo*[bar]; 
for (int i = 0; i < bar; i++) 
    arrayDynamic2D[i] = new foo[baz]; 

和以類似的方式釋放:

for (int i = 0; i < bar; i++) 
    delete [] arrayDynamic2D[i]; 
delete [] arrayDynamic2D; 

靜態存儲器分配在堆棧中,而動態存儲器分配在堆堆

+0

在我們知道'bar'的值是什麼之前,我們可以做'新foo [bar]'*嗎?我只是想了解爲什麼我們需要使用動態內存分配。這是因爲這個原因嗎? – 0x499602D2

+0

顯然,'bar'需要被程序員或用戶初始化,然後才能用在'new foo [bar]'中。但是,它不一定是'const int'類型。 – Raptor

+0

但我仍然沒有得到爲什麼我們需要使用動態內存分配? – 0x499602D2