C++ 三维数组函数返回

3

我有一个三维数组看起来像这样:

int map[100][100][100];

我想将其用作函数的返回类型,无论是指针还是其他类型:

int* World::CreateCell() {

    int map[100][100][100];

    return map;

}

然而,我找不到适合3D数组的返回类型,不能像2D数组一样使用int*。

即使像这样也不起作用:

int a[100][100][100];
int* b = a;

Visual Studio似乎认为数据类型是int*(100)(100),但这毫无意义且无法工作。

不过,值得一提的是,我已经搜索过这个问题并没有找到解决方案。谢谢。


3
你走错了方向。即使是对于一个二维数组,返回指向本地数组的指针也是错误的。改用嵌套的std::array或者std::vector代替。 - 463035818_is_not_a_number
在 C++ 中,通常不应使用 C 风格数组。这没有什么理由。如果你遵循此规则,则大多数此类问题都会消失…… - A M
我搞定了兄弟们,用嵌套向量排序了。 - A Novice Programmer
仅供记录:在coliru上的演示 - Scheff's Cat
3个回答

1

如果您需要一个3D C风格数组,您需要有一个指向指针的指针,即int***。此外,如果您使用类似这样的创建函数,则需要分配内存。否则,您将从该函数返回静态分配的内存。

以下是如何快速实现的示例:

#include <iostream>

static int*** create_cell() {    
    constexpr std::size_t n = 100;
    int*** map = new int**[n];
    for (std::size_t i = 0u; i < n; ++i) {
        map[i] = new int*[n];
        for (std::size_t j = 0u; j < n; ++j) {    
            map[i][j] = new int[n];
        }
    }   
    return map;
}

static void delete_cell(int***& map) { 
    constexpr std::size_t n = 100;
    for (std::size_t i = 0u; i < n; ++i) {
        for (std::size_t j = 0u; j < n; ++j) {    
            delete[] map[i][j];
        }
        delete[] map[i];
    }
    delete[] map;    
}

int main()
{
    int*** a = create_cell();

    a[0][0][0] = 1;
    std::cout << "a[0][0][0] = " << a[0][0][0] << std::endl;
    
    delete_cell(a);

    return 0;
}

这取决于你的使用情况:但对于现代C ++,您可以使用stl中的容器来简化生活,例如std::vector 和std::array 。请参考此处:std::arraystd::vector 例如,您可以定义您的3D类型:
#include <array>
#include <vector>
using vector_3d = std::vector<std::vector<std::vector<int>>>;
using array_3d = std::array<std::array<std::array<int, 100>, 100>, 100>;

然后将它们用作:

array_3d b;
b[0][0][0] = 1;
std::cout << "b[0][0][0] = " << b[0][0][0] << std::endl;

0

首先你应该:

永远不要返回本地非静态变量的引用或指针。

现在回到你的问题:

我想将其用作函数的返回类型,无论是指针还是其他形式。但是我找不到适当的返回类型来表示三维数组。

以下是你可以使用的三维数组的方法。基本上有两种方法来解决这个问题:

方法1

//CreateCell is a function that returns a pointer to a 3D array of the size 100,100,100
int (*CreateCell())[100][100][100] {

    int map[100][100][100];

    return &map;
}

方法1如下所示这里

方法2

//CreateCell is a function that returns a pointer to a 3D array of the size 100,100,100
auto CreateCell() -> int(*)[100][100][100] {

    int map[100][100][100];

    return &map;
}

方法2使用尾置返回类型,如此处所示here

注意

两种方法都返回指向本地变量的指针,必须避免。我只是提供/写了答案,以便您可以看到如何按您所需返回3D数组的指针。您可以创建并返回一个3D `std::vector`来代替。


0

考虑使用一个简单的包装器来封装您的矩阵:

struct Wrapper { int Mat[100][100][100] = {0}; };

然后签名将变成这样:

Wrapper *foo(...) { ... }

这是一个简单的工作示例:

#include <iostream>
struct Wrapper { int Mat[100][100][100] = {0}; };
Wrapper *inc(Wrapper *w)
{
    for (int i=0;i<100;i++)
        for (int j=0;j<100;j++)
            for (int k=0;k<100;k++)
                w->Mat[i][j][k] += (i+j+k);
    return w;
}
int main(int argc, char **argv)
{
    Wrapper w;
    Wrapper *out = inc(&w);
    std::cout << out->Mat[5][6][7] << "\n";
    return 0;
}

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