如何初始化双**?

时间:2016-06-14 08:39:13

标签: c++ pointers matrix double allocation

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

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

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

3 个答案:

答案 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();