将 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;
};
}
我最近开始使用 C++ 进行数值计算,我想在模拟过程中使用 Struct Operators
来存储 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;
};
}