c++ - 在堆上存储 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次)
提前致谢!
解决方案
在您的错误消息中,编译器告诉您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 */;
}
}
}
推荐阅读
- python-3.x - 如何在python中使用带参数的函数更改n个不同的全局变量?
- python - Pandas DataFrame- 迭代并与之前的值进行比较
- node.js - Angular 和 Nodejs 的最佳实践使用相同的代码存储库并在同一服务器上发布
- tensorflow - Tensorflow 集线器错误 - “URLError:
" - html - 将语言添加到 Web 语音 API
- spring-boot - 有什么方法可以将主 jar 和源 jar 组合在一个 jar 中
- google-apps-script - 将 HTML 格式(表格)的 Gmail 电子邮件内容解析为 Google 电子表格列
- git - 撤消拉取请求
- angular - 如何使用 Angular/RXJS 对嵌套可观察数组的内部属性求和?
- python - 使用 Python 修复慢速系统