gpt4 book ai didi

c++ - 在 C++ 中分配 3D 数组的最惯用的方法是什么?

转载 作者:行者123 更新时间:2023-12-01 14:49:32 24 4
gpt4 key购买 nike

我有以下代码来分配 3d 数组:


int ***allocate3DArray(int y, int x, int r) {
int ***array = (int ***) malloc(sizeof(int **) * y);
for (int i = 0; i < y; i++) {
array[i] = (int **) malloc(sizeof(int *) * x);
for (int j = 0; j < x; j++) {
array[i][j] = (int *) malloc(sizeof(int) * r);
for (int k = 0; k < r; k++) {
array[i][j][k] = 0;
}
}
}
return array;

}


void free3d(int ***arr, int y, int x, int r) {
for (int i = 0; i < y; i++) {
for (int j = 0; j < x; j++) {
free(arr[i][j]);
}
free(arr[i]);

}
free(arr);

}


这看起来有点笨拙,如果我的 malloc 失败,则很难进行错误处理。

也就是说,它非常符合人体工程学,因为我可以像这样简单地访问一个元素: int a = arr[x][y][z]
什么是初始化 3d 数组的最佳方法,它提供相同的人体工程学灵活性,同时减轻上述一些缺点?

我试过这个:
    std::array < std::array < std::array < int, radius >, image.cols >, image.rows > houghSpace;


但我有一个错误:
 error: non-type template argument is not a constant expression
std::array < std::array < std::array < int, radius >, image.cols >, image.rows > houghSpace;
^~~~~~
sobel.cpp:117:49: note: initializer of 'radius' is not a constant expression
sobel.cpp:116:15: note: declared here
const int radius = image.rows / 2;
^
sobel.cpp:117:71: error: expected a type
std::array < std::array < std::array < int, radius >, image.cols >, image.rows > houghSpace;
^
sobel.cpp:117:86: error: C++ requires a type specifier for all declarations
std::array < std::array < std::array < int, radius >, image.cols >, image.rows > houghSpace;
^

最佳答案

对 C++ 数组的一些强烈建议

  • 你不能在 C++ 中使用 malloc 和 free
  • 你甚至不应该再使用 NEW 和 DELETE
  • 您应该从不 对拥有的内存使用原始指针。请使用 std::unique_ptrstd::shared_ptr反而。

  • 所以,永远不要使用如上所示的函数 (allocate3DArray, free3d)

    好的。所以,现在我们要切换到 std::array你想知道错误信息。它们相当清楚,如您的示例所示。一个 std::array有一个静态大小。它不是动态的。所以你需要给出一个编译时间常量来定义大小。

    您正在寻找的是 std::vector .它是动态的,可以增加大小并且还有一个索引操作符。

    它可以与索引运算符 [] 一起使用没有限制。

    请看下面的例子
    #include <iostream>
    #include <iterator>
    #include <vector>

    int main()
    {
    // Dimensions for the 3 dimensional vector
    size_t xSize{3};
    size_t ySize{4};
    size_t zSize{5};
    int initialValue{0};

    // Define 3 dimensional vector and initialize it.
    std::vector<std::vector<std::vector<int>>> array3d(xSize, std::vector<std::vector<int>>(ySize, std::vector<int>(zSize,initialValue)));

    array3d[1][2][3] = 42;

    std::cout << "Result: " << array3d[1][2][3] << "\n";

    return 0;
    }

    关于c++ - 在 C++ 中分配 3D 数组的最惯用的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58962738/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com