我需要初始化/使用双**(在我的标题中删除):
double **pSamples;
分配(在此期间)NxM矩阵,其中N和M来自两个函数:
const unsigned int N = myObect.GetN();
const unsigned int M = myObect.GetM();
对于我从堆和动态分配中学到的东西,我需要关键字new
,或者使用STL vector
,它将在堆中自动分配/释放。
所以我尝试了这段代码:
vector<double> samplesContainer(M);
*pSamples[N] = { samplesContainer.data() };
但它仍然说我需要一个恒定值?您将如何分配/管理(在此期间)此矩阵?
答案 0 :(得分:1)
初始化指针指针的老式方式对$ echo 23
23
$ !echo 44 # expands to "echo 23 44"
23 44
运算符来说是正确的,你首先要初始化第一个数组,它是一个指向双精度的指针({ {1}}),那么你将迭代分配下一个指向双精度(new
)的指针。
double*
第一个new分配一个双指针数组,然后将每个指针分配给第二个double*
分配的指针数组。
这是旧方法,记得使用double** pSamples = new double*[N];
for (int i = 0; i < N; ++i) {
pSambles[i] = new double[M];
}
运算符在某个时刻再次释放内存。但是,C ++提供了更好的顺序存储器管理,例如new
可以用作矢量矢量,或者只是一个能够保存整个缓冲区的矢量。
如果你去矢量方式的矢量,那么你有一个这样的声明:
delete []
您将能够使用vector
函数引用元素:vector<vector<double>> samples;
或使用数组运算符:.at
。
或者,您可以创建一个具有足够存储空间的samples.at(2).at(0)
来保存多维数组,只需将其大小调整为samples[2][0]
个元素即可。但是,这种方法难以调整大小,老实说,您也可以使用vector
完成此操作:N * M
,但这会为您提供new
而不是new double[N * M]
。
答案 1 :(得分:1)
使用RAII进行资源管理:
std::vector<std::vector<double>> samplesContainer(M, std::vector<double>(N));
然后是兼容性
std::vector<double*> ptrs(M);
for (std::size_t i = 0; i != M; ++i) {
ptrs[i] = samplesContainer[i].data();
}
因此ptrs.data()
传递double**
。
答案 2 :(得分:-1)
samplesContainer.data()
返回double*
,bur表达式*pSamples[N]
的类型为double
,而不是double*
。我想你想要pSamples[N]
。
pSamples[N] = samplesContainer.data();