我需要有一个二维数组。它的宽度约为 900。它的高度也是如此(相同的宽度值)。
处理两个循环(一个用于宽度,一个用于高度),我真的需要访问我将处理的 900X900 图像的所有像素。
数组的大小太大(指定原始数和列数时出错)。
我考虑过使用动态数组来建立它,以优化计算时间并在每次处理两个循环上的一个像素时释放内存。
但我真的找不到我想要声明二维动态数组的语法(malloc,设置数组元素值和释放内存)。
我需要有一个二维数组。它的宽度约为 900。它的高度也是如此(相同的宽度值)。
处理两个循环(一个用于宽度,一个用于高度),我真的需要访问我将处理的 900X900 图像的所有像素。
数组的大小太大(指定原始数和列数时出错)。
我考虑过使用动态数组来建立它,以优化计算时间并在每次处理两个循环上的一个像素时释放内存。
但我真的找不到我想要声明二维动态数组的语法(malloc,设置数组元素值和释放内存)。
将其包装在一个类中:
class Matrix2D {
typedef std::vector<double> Column;
std::vector<Column> columns;
public:
Matrix2D(unsigned int width, unsigned int height) :
columns(width, Column(height)) {
}
double& at(unsigned int i, unsigned int j) {
return columns[i][j];
}
};
Matrix2D matrix(900, 900);
matrix.at(45, 65) = 1234.5678;
我需要一个二维数组
double
由于您使用的是 C++,因此您应该使用 STL 类来为您处理丑陋的内存管理。所以你实际上是在寻找std::vector< std::vector<double> >
,或者为了你的代码的可读性:
#include <vector>
typedef std::vector<double> DVector; // row represented by vector of doubles
typedef std::vector<DVector> MyVector; // 2D array as a vector of these rows
然后尽可能避免使用动态分配。利用RAII 成语:
{
MyVectorarr; // vector object with automatic storage duration
} // <-- vector is automatically destructed when execution goes out of scope
我将 malloc 与纯 C 相关联,而不是 C++(正如前面的答案指出的那样,您应该使用 std::vector)。但是,如果您真的想:
// allocate the memory in a block
double* block = (double *) malloc(sizeof(double) * xSize * ySize);
// allocate memory for the accessor array
double* accessor = (double*) malloc(sizeof(double*) * xSize);
// assign memory addresses
double* curPtr = block;
for (int i = 0; i < xSize; ++i) {
accessor[i] = curPtr;
curPtr += ySize;
}
// you can now access the array via accessor[x][y]
// now need to free malloced memory:
free(accessor);
free(block);
如果你这样做,我强烈建议将它与 RAII 模式联系起来,否则你最终会出现内存泄漏。使用 STL 的容器是一种更好的方法。