これを行うにはいくつかの方法があります。
最も簡単な方法は、ベクターを使用することです。独自のメモリーを管理したくない場合は、これが最適です。しかし、私は自分の記憶を管理するのが好きで、時にはこの方法が遅くて扱いにくいと感じました。私は他の方法を学びました。
最速の方法は、1次元配列を割り当てて2次元配列と同じように扱うことです。次に例を示します。
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;
この種の設定では、メモリに大混乱を招く傾向があります。これらの2次元配列だけでは、幅+1の独立した配列がmallocされます。 1つの大きな配列をmallocしてインデックスを自分で見つけ出すほうが速いでしょう。
Dupe? http://stackoverflow.com/questions/2294338/c-2d-dynamic-array –