如何初始化双**?

How to init a double**?

我需要init/use一个双**(在我的header中声明):

double **pSamples;

分配(期间)一个 NxM 的矩阵,其中 N 和 M 来自两个函数:

const unsigned int N = myObect.GetN(); 
const unsigned int M = myObect.GetM(); 

对于我从堆和动态分配中学到的东西,我需要关键字new,或者使用STL vector,它将在堆内自动管理allocate/free。

所以我尝试了这个代码:

vector<double> samplesContainer(M);
*pSamples[N] = { samplesContainer.data() };

但它仍然说我需要一个常数值?你会如何allocate/manage(期间)这个矩阵?

samplesContainer.data() returns double*,但是表达式 *pSamples[N] 的类型是 double,不是 double*。我想你想要 pSamples[N].

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],但是这会给您一个 double* 而不是 double**

使用 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**