创建动态2D数组

时间:2013-03-07 13:39:45

标签: c++ arrays dynamic-arrays dynamic-allocation

我需要一个双精度的2D数组。 它的宽度大约是900.它的高度也是(相同的宽度值)。

处理两个循环(一个用于宽度,一个用于高度),我真的需要访问我将处理的900X900图像的所有像素。

数组的大小太大(指定raw和column的数量时出错)。

我考虑用动态数组建立它以优化计算时间,并在每次处理两个循环上的一个像素时释放内存。

但我真的找不到我想要声明2D动态数组(malloc,设置数组元素值和释放内存)的语法。

3 个答案:

答案 0 :(得分:3)

将它包装在课堂上:

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;

答案 1 :(得分:2)

  

我需要一个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 idiom

{
    MyVectorarr;  // vector object with automatic storage duration
} // <-- vector is automatically destructed when execution goes out of scope

可能对您有所帮助的问题:
Multi-dimensional vector
Initialization of a vector of vectors?
vector of vector

答案 2 :(得分:1)

我将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的容器是一种更好的方法。