首页 > 解决方案 > 在堆上存储 3D 数组作为结构成员

问题描述

我最近开始使用 C++ 进行数值计算,我想Struct Operators在模拟过程中使用 a 来存储 3D 字段。我在堆上创建 3D 数组

const unsigned int RES = 256;
auto arr3D = new double [RES][RES][RES];

因为根据我的测试,这种方法比使用 Boost_multiarr、Eigen Tensor 或嵌套向量更快。到目前为止,这适用于我的简约 Test.cpp,但是当我尝试将这些相同的 3D 数组实现为 my 的成员时Struct Operators,我无法再使用该auto命令:

const unsigned int RES = 256;

struct Operators {
public:
    std::complex<double>*** wfc;         // edited, see 'spitconsumers' comment

    Operators(Settings &set) {        // just another structure used by Operators
        wfc = new std::complex<double> [RES][RES][RES];

        // ...Initializing wfc using Settings

};

在这种情况下,我发现无法声明wfc,这样我就不会收到类型的错误

错误:无法在赋值中将 'std::complex (*)[256][256]' 转换为 'std::complex***'

所以我的问题是如何正确声明3D 数组wfc以及维护这种结构方法是否完全可能/有用。访问wfc[i][j][k]如果wfc不是结构的成员通常会更快吗?(我将不得不这样做〜10 ^ 6次)

提前致谢!

标签: c++multidimensional-arraystructheap-memorynew-operator

解决方案


在您的错误消息中,编译器告诉您new complex [RES][RES][RES]正在返回 type std::complex (*)[256][256]

double wfc应该是std::complex*** wfc

必须知道类成员类型,并且由于您在定义成员变量时没有对其进行初始化,因此编译器无法推断出变量的类型,这就是为什么auto当您不是时不能作为类成员类型工作的原因立即分配一些东西给它。但是您将值直接分配给测试程序中的变量,从而允许编译器在那里推断出类型。

此外,该new运算符正在返回一个指向未初始化指针数组的std::complex<double>**指针。您需要调用new所有未初始化的指针。

std::complex<double>*** wfc;

wfc = new std::complex<double>** [RES];

for(int i = 0; i < RES; i++) {
    wfc[i] = new std::complex<double>* [RES];

    for(int j = 0; j < RES; j++) {
        wfc[i][j] = new std::complex<double> [RES];

        for(int k = 0; k < RES; k++) {
            wfc[i][j][k] = /* insert default value here */;
        }
    }
}

推荐阅读