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

Posted

技术标签:

【中文标题】如何在 C++ 中初始化 3D 数组【英文标题】:How to initialize 3D array in C++ 【发布时间】:2011-01-11 20:14:04 【问题描述】:

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

int min[1][1][1] = 100,  100, 100; //this is not the way

【问题讨论】:

【参考方案1】:

这是在 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;
        
    

【讨论】:

int*** array; 在 C 中声明指向尚未分配的 3D 数组的指针时很有用。【参考方案2】:

每个人似乎都忘记了std::valarray。它是用于平面多维数组、索引和切片的 STL 模板。

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

没有静态初始化,但这真的很重要吗?

【讨论】:

您的 cmets/answer 让我在 std::valarray 上提出了一个问题:***.com/questions/2187648/…【参考方案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  ;

如您所见,有两组,每组包含三组,每组 4 个数字。

【讨论】:

对于多维数组,您不需要 嵌套大括号。该标准要求您可以在一个平面列表中一起运行这些值。 只要你不关心警告:warning: missing braces around initializer (near initialization for 'min[0]')【参考方案4】:

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

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 数组很容易使用大量空间。将它包装在这样的类中也使得将数组(通过复制或通过引用)传递给其他函数变得微不足道,而对多维静态数组进行任何传递都是非常有问题的。

上面的代码只是一个例子,它可以被优化并变得更完整。在各种库中当然也有这个的现有实现,但我不知道。

【讨论】:

对于现有库,有 Boost.MultiArray 和 Boost.uBlas (www.boost.org)。后者更适合线性代数。将 Boost 视为标准 C++ 库(或“他们遗漏的语言和标准库 (TM)”)的扩展。 @Emile:我没有投反对票,但new int[2][3][4] 可以解决问题。至于@Tronic 的代码,它只是重复了std::valarray 的努力。 std::vector 本质上是一个很好的 RAII 包装器,用于 new[]/delete[] (它还做了一些其他事情),所以我总是更喜欢它而不是手动管理内存。当然,这会浪费一些字节来跟踪容器大小,但另一方面,您可以使用它来计算 3D 数组尺寸。我看不出 std::valarray 与此有什么关系,因为我没有为数组定义任何算术运算,而且 valarray 不知道如何显示为多维数组。 @Potatoswatter:在我的评论中,我忘记添加“......只有在运行时才知道尺寸”。等等,这仍然没有意义。我现在就闭嘴。 :-) @Tronic:通过使用std::gslice 下标,您可以获得对std::valarray 的多维访问。请参阅我的答案中的链接。什么意思,还没有为数组定义任何算术运算?

以上是关于如何在 C++ 中初始化 3D 数组的主要内容,如果未能解决你的问题,请参考以下文章

将 C# 3D 数组作为 1D 字节数组传递给 C++ 库

如何在 python 中用两个 2D 数组初始化一个 3D 数组?

如何在 C++ 中初始化一个指针数组

如何在 C++ 类中初始化可变大小数组?

如何在 C++ 中将一组整数转换为 3D 向量?

如何在 C++ 中声明后初始化 n 大小的数组