将 3D 数组作为结构成员存储在堆上

Storing 3D Array on Heap as Structure Member

我最近开始使用 C++ 进行数值计算,我想在模拟过程中使用 Struct Operators 来存储 3D 场。 我使用

在堆上创建 3D 数组
const unsigned int RES = 256;
auto arr3D = new double [RES][RES][RES];

因为根据我的测试,这种方法比使用 Boost_multiarr、特征张量或嵌套向量更快。 到目前为止,这在我的极简主义 Test.cpp 中运行良好,但是当我尝试将这些相同的 3D 数组实现为我的 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 的方法,这样我就不会得到

类型的错误

error: cannot convert 'std::complex (*)[256][256]' to 'std::complex***' in assignment

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

提前致谢!

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

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

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

此外,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 */;
        }
    }
}

错误信息returns声明正确,std::complex<double>(*wfc)[RES][RES];.

const unsigned int RES = 256;
struct Settings {};
struct Operators {
public:
    std::complex<double>(*wfc)[RES][RES];         // 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
        // Setting the last element
        wfc[254][254[254] = 42;

    };
}