web-dev-qa-db-ja.com

C ++で3D配列を初期化する方法

C++で3D配列を初期化する方法

int min[1][1][1] = {100, { 100, {100}}}; //this is not the way
33
Chris_45

質問の配列には要素が1つしかないため、完全に初期化するために必要な値は1つだけです。配列の各次元に1つずつ、3セットの中括弧が必要です。

int min[1][1][1] = {{{100}}};

より明確な例は次のとおりです。

int arr[2][3][4] = { { {1, 2, 3, 4}, {1, 2, 3, 4}, {1, 2, 3, 4} },
                     { {1, 2, 3, 4}, {1, 2, 3, 4}, {1, 2, 3, 4} } };

ご覧のとおり、2つのグループがあり、それぞれに4つの数字の3つのグループが含まれています。

61
Carl Norum

静的な多次元配列の代わりに、おそらく1次元配列を使用し、乗算によってインデックスを計算する必要があります。例えば。

class Array3D {
    size_t m_width, m_height;
    std::vector<int> m_data;
  public:
    Array3D(size_t x, size_t y, size_t z, int init = 0):
      m_width(x), m_height(y), m_data(x*y*z, init)
    {}
    int& operator()(size_t x, size_t y, size_t z) {
        return m_data.at(x + y * m_width + z * m_width * m_height);
    }
};

// Usage:
Array3D arr(10, 15, 20, 100); // 10x15x20 array initialized with value 100
arr(8, 12, 17) = 3;

std :: vectorは、ストレージを動的に割り当てます。これは、スタックスペースが非常に限られていることが多く、3D配列が多くのスペースを簡単に使用するため、良いことです。このようなクラスでラップすると、配列を(コピーまたは参照によって)他の関数に渡すのも簡単になりますが、多次元の静的配列を渡すことは非常に問題です。

上記のコードは単なる例であり、最適化してより完全にすることができます。さまざまなライブラリにこれの既存の実装も確かにありますが、私は知りません。

9
Tronic

C++で3D配列を動的に割り当てる別の方法を次に示します。

int dimX = 100; int dimY = 100; int dimZ = 100;
int*** array;    // 3D array definition;
// begin memory allocation
array = new int**[dimX];
for(int x = 0; x < dimX; ++x) {
    array[x] = new int*[dimY];
    for(int y = 0; y < dimY; ++y) {
        array[x][y] = new int[dimZ];
        for(int z = 0; z < dimZ; ++z) { // initialize the values to whatever you want the default to be
            array[x][y][z] = 0;
        }
    }
}
7
Kenny Cason

誰もがstd::valarray。これは、フラットな多次元配列、およびそれらのインデックス付けとスライスのためのSTLテンプレートです。

http://www.cplusplus.com/reference/std/valarray/

静的な初期化はありませんが、それは本当に重要ですか?

3
Potatoswatter