如何初始化双**?

马克兹

我需要初始化/使用双**(在标题中已清除):

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() };

但它仍然说我需要一个恒定值?您将如何(在此期间)分配/管理此矩阵?

汤米·安德森(Tommy Andersen)

老式的方式初始化指针的指针的,是正确足以与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大元素来创建具有足够存储空间的多维数据集,以容纳多维数组但是,此方法很难调整大小,并且说实话,您也可以使用newnew double[N * M],但是这样做会给您adouble*而不是a double**

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章