我需要初始化/使用双**(在标题中已清除):
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() };
但它仍然说我需要一个恒定值?您将如何(在此期间)分配/管理此矩阵?
在老式的方式初始化指针的指针的,是正确足以与new
运营商,你会首先初始化第一个数组是一个指针,以双打(double*
),那么你会遍历该分配下一个指针双打(double*
) 。
double** pSamples = new double*[N];
for (int i = 0; i < N; ++i) {
pSambles[i] = new double[M];
}
第一个new分配一个双指针数组,然后将每个指针分配给第二个指针分配的指针数组new
。
那是做旧的方式,请记住在某个时候使用delete []
操作符再次释放内存。但是,C ++提供了更好的顺序内存管理,例如vector
,您可以将其用作向量的向量,也可以用作能够容纳整个缓冲区的单个向量。
如果您使用向量方式的向量,那么您将有一个这样的声明:
vector<vector<double>> samples;
您将能够使用如下.at
函数来引用元素:samples.at(2).at(0)
或使用数组运算符:samples[2][0]
。
或者,您可以vector
通过简单地将尺寸设置为N * M
大元素来创建具有足够存储空间的多维数据集,以容纳多维数组。但是,此方法很难调整大小,并且说实话,您也可以使用new
:new double[N * M]
,但是这样做会给您adouble*
而不是a double**
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句