如何初始化双**?
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**
。
我需要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**
。