如何在C++中初始化3D数组

Chr*_*_45 35 c c++ arrays multidimensional-array

如何在C++中初始化3d数组

int min[1][1][1] = {100, { 100, {100}}}; //this is not the way
Run Code Online (Sandbox Code Playgroud)

Car*_*rum 64

您问题中的数组只有一个元素,因此您只需要一个值即可完全初始化它.您需要三组大括号,一组用于阵列的每个维度.

int min[1][1][1] = {{{100}}};
Run Code Online (Sandbox Code Playgroud)

一个更清晰的例子可能是:

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} } };
Run Code Online (Sandbox Code Playgroud)

如您所见,有两组,每组包含三组,每组4个.

  • 只要你不关心警告:`警告:初始化器周围缺少大括号(接近初始化'min [0]') (5认同)
  • 对于多维数组,您不需要*嵌套大括号.该标准要求您可以在平面列表中一起运行这些值. (3认同)

Tro*_*nic 9

您应该使用一维数组并通过乘法计算索引,而不是静态多维数组.例如

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;
Run Code Online (Sandbox Code Playgroud)

std :: vector动态分配存储,这是一件好事,因为堆栈空间通常非常有限,3D数组很容易占用大量空间.将它包装在类这样的类中也会使数组(通过复制或引用)传递给其他函数是微不足道的,而进行任何多维静态数组的传递都是非常有问题的.

上面的代码只是一个示例,可以进行优化并使其更加完整.当然在各种库中也存在这种实现,但我不知道.


Ken*_*son 8

这是在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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)