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

40

如何在C++中初始化一个三维数组

int min[1][1][1] = {100, { 100, {100}}}; //this is not the way
4个回答

69

你的问题中的数组只有一个元素,因此你只需要一个值来完全初始化它。你需要三组括号,每个维度一个。

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} } };

正如您所看到的,这里有两组数据,每组数据都包含三组由4个数字组成的数据。


4
多维数组不一定需要嵌套的括号。标准要求你可以将值直接在一个平面列表中运行。 - Potatoswatter
5
只要你不在意警告:“warning: missing braces around initializer (near initialization for 'min[0]')”,就可以了。 - Carl Norum

10

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

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 数组很容易使用大量空间。将其包装在类中还使得将数组(通过复制或引用)传递给其他函数变得非常简单,而传递多维静态数组则非常棘手。

上面的代码只是一个示例,它可以进行优化并使其更加完整。当然,各种库中肯定也存在此类实现,但我不知道有哪些。


@Emile:我没点踩,但是new int[2][3][4]应该可以解决问题。至于@Tronic的代码,只是在重复std::valarray的工作。 - Potatoswatter
1
std::vector本质上是new[]/delete[]的一个很好的RAII包装器(它还做了一些其他的事情),所以我总是喜欢它胜过手动管理内存。当然,在这里,它会浪费一些字节来跟踪容器大小,但另一方面,您可以使用它来计算3D数组的维度。我不明白std::valarray与此有什么关系,因为我没有为数组定义任何算术操作,而且valarray不知道如何显示为多维数组。 - Tronic
@Potatoswatter:在我的评论中,我忘了加上“...只有在运行时才知道尺寸”。等等,这仍然没有意义。我现在就闭嘴。 :-) - Emile Cormier
@Tronic:通过使用std::gslice下标访问std::valarray,您可以获得多维访问。请参见我的答案中的链接。您说什么,数组没有定义任何算术运算? - Potatoswatter
数组语法在较小的多维情况下更加简洁、清晰和方便。 - Phil

9

以下是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;
        }
    }
}

1
在C语言中,当声明一个指向尚未分配的三维数组的指针时,int*** array;非常有用。 - Doug Thompson

3

你的评论/回答让我对std::valarray产生了一个问题:https://dev59.com/JXI95IYBdhLWcg3wtwVe - Emile Cormier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接