声明在堆上运行时不会更改大小的多维数组的正确方法是什么? (理想情况下,在C++ 11中,如果只有C++ 14(而不是C++ 17)具有某些功能,我也很想听听它,但可能对我不起作用)

到目前为止,我已经浏览了有关该主题的数十个问题和答案,但似乎没有一个真正的答案/一些答案与他人冲突。

我发现了以下解决方案以及它们似乎存在的使它们不可行的问题(大多数解决方案均来自SO答案及其评论,所有示例均以3D数组为目标给出):

  • 用新的/声明的指针数组声明的[[[]]]数组
    问题:在内存中不连续,每个单独的数组在内存中都有其独立的位置
  • 多个嵌套在彼此内部的std::arrays/boost::arrays
    问题:在内存中不连续,每个单独的数组在内存中都有其独立的位置
  • 矩阵
    问题:只是std::array的容器,相同的问题基本上适用于
  • 彼此嵌套的多个std:vector
    问题:动态,几乎是
  • 之前提到的所有其他问题
  • 声明为单个块,并带有指向普通[]数组的指针,然后在运行时使用诸如GetIndex(array,x,y,z)之类的函数通过计算来遍历索引
    问题:这似乎可以解决所有问题,但是此解决方案似乎不太理想,因为在需要访问/更改经常需要更改元素的情况下,这似乎会引入大量的CPU开销

  • 与此一点无关的是,如果这些解决方案在类里面,我也遇到了一些问题,我不得不从外部访问它们的值。运算符,所以如果有人能以一个正确的声明和对作为类成员的堆分配多维数组的正确访问的例子来说明正确的解决方案,我将不胜感激。

    最佳答案



    ...



    是的,C++多维数组非常棘手,并且非常擅长使C++代码不可读。实际上,如果在编译时知道大小,则可以创建静态多维数组,因此您可以将其分配为内存的连续块。

    int main()
    {
        int arr[100][200][100]; // allocate on the stack
    
        return 0;
    }
    

    问题是如何在堆上分配它...没问题,只需将其包装到一个结构中,然后在堆上分配该结构即可。
    #include <memory>
    
    struct Foo
    {
        int arr[100][200][100];
    };
    
    int main()
    {
        auto foo = std::make_unique<Foo>(); // allocate on the heap
        auto& arr = foo->arr;
    
        arr[1][2][3] = 42;
    
        return 0;
    }
    
    std::make_unique调用在堆上分配Foo,并保证将释放内存。另外,您可以使用几乎为零的样板代码访问Foo内部和外部的数组。好的!

    09-25 18:36
    查看更多