有幾種方法可以做到這一點。
最簡單的方法是使用矢量,如果你不喜歡管理自己的記憶,這對你來說是完美的。但是,因爲我喜歡管理自己的記憶,而且我發現這種方法有時很慢,很麻煩,所以我學到了其他方法。
最快的方法是分配一維數組並將其當作二維數組處理。這裏有一個例子:
int *array = new int[width*height];
int get_array(int column, int row)
{
return array[row*width + column];
}
delete [] array;
這可以推廣到n個維度:
int *array = new int[w1*w2*...*wn];
int get_array(int i1, int i2, ..., int in)
{
return array[in*(w1*w2*...*w(n-1)) + i(n-1)*(w1*w2*...*w(n-2)) + ... + i2*w1 + i1];
}
delete [] array;
如果你希望能夠有不同寬度的每一行,那麼你可以讓數組指針。此解決方案初始化和清理速度較慢,但靈活,可調,且執行時間相對較快。如果你犯了一個錯誤,它也可能是非常危險的。
int **array = new int*[height];
for (int i = 0; i < height; i++)
array[i] = new int[width(i)];
此時,訪問它,所有你需要做的就是習慣
array[i][j]
然而,釋放這個數組,你必須這樣做逐行
for (int i = 0; i < height; i++)
delete [] array[i];
delete [] array;
這也可以概括爲第n維。
int **....*array = new int**...*[w1];
for (int i1 = 0; i1 < w1; i1++)
{
array[i1] = new int**..*[w2];
for (int i2 = 0; i2 < w2; i2++)
{
array[i1][i2] = new int**.*[w3];
...
for (int in = 0; in < wn; in++)
array[i1][i2]...[in] = new int[wn];
}
}
for (int i1 = 0; i1 < w1; i1++)
{
for (int i2 = 0; i2 < w2; i2++)
{
...
for (int in = 0; in < wn; in++)
delete [] array[i1][i2]...[in];
...
delete [] array[i1][i2];
}
delete [] array[i1];
}
delete [] array;
這種設置往往會對內存造成嚴重破壞。只是這些的二維數組會導致寬度+1的獨立數組被malloc編輯。只需malloc一個大數組並且自己計算索引就會更快。
Dupe? http://stackoverflow.com/questions/2294338/c-2d-dynamic-array –