6

3D 配列の動的割り当てについて少し混乱しています。現在、次のように 1 つの大きなメモリ ブロックを割り当てています。

int height = 10;
int depth = 20;
int width = 5;

int* arr;
arr = new int[height * width * depth];

ここで、3D 配列の値を変更したいと思います。たとえば、次のようにします。

//arr[depth][width][height]
arr[6][3][7] = 4;

ただし、上記のコードを使用して値を変更することはできません。単一のインデックスを使用して、深さ = 6、幅 = 3、高さ = 7 の位置にある要素にアクセスするにはどうすればよいですか?

arr[?] = 4;

3D 配列を動的に割り当てるより良い方法はありますか?

4

4 に答える 4

10

フラットな 3 次元配列にインデックスを付けるには、次のようにします。

arr[x + width * (y + depth * z)]

ここで、x、y、z はそれぞれ 1 番目、2 番目、3 番目の次元に対応し、幅と深さは配列の幅と深さです。

これは を単純化したものですx + y * WIDTH + z * WIDTH * DEPTH

于 2012-04-20T00:49:07.180 に答える
7

arr[height][width][depth] のような単純なインデックス作成メカニズムを使用し、割り当てられたメモリのデフォルト値を 0 に初期化するには、次のことを試してください。

// Dynamically allocate a 3D array
/*  Note the parenthesis at end of new. These cause the allocated memory's
    value to be set to zero a la calloc (value-initialize). */
    arr = new int **[height]();
    for (i = 0; i < height; i++)
    {
        arr[i] = new int *[width]();
        for (j = 0; j < width; j++)
            arr[i][j] = new int [depth]();
    }

そして、対応する解放は次のとおりです。

//Dynamically deallocate a 3D array

for (i = 0; i < rows; i++)
{
    for (j = 0; j < columns; j++)
        delete[] arr[i][j];
    delete[] arr[i];
}
delete[] arr;
于 2015-05-17T06:57:14.803 に答える