【问题标题】:Creating a dynamic 2D array创建动态二维数组
【发布时间】:2013-02-22 17:45:57
【问题描述】:

我需要一个二维数组。 它的宽度在 900 左右。它的高度也是如此(相同的宽度值)。

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

数组的大小太大(指定原始数和列数时出错)。

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

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

【问题讨论】:

  • 提示:在 C++ 中,std::vector 是新的 malloc
  • 900х900х4=3.2M 不算多...动态数组非常慢。向我们提供有关如何获取此图像以及如何处理它的更多信息。你有什么错误?
  • 它是用堆栈溢出来写的!
  • 当它要处理图像的一个窗口时(例如100X100),我有很好的计算,但我想处理整个图像,因此,当我改变元素的数量时我的数组到 900 :: ALERT with Stack over flow。
  • 不要在堆栈上创建它。使用 malloc 为数组分配内存或在编译器选项中增加堆栈大小。

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


【解决方案1】:

将其包装在一个类中:

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 分钟来处理整个图像的一个小窗口(300X300)谢谢
【解决方案2】:

我需要一个二维数组double

由于您使用的是 C++,因此您应该使用 STL 类来为您处理丑陋的内存管理。所以你实际上是在寻找std::vector&lt; std::vector&lt;double&gt; &gt;,或者是为了你的代码的可读性:

#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

【讨论】:

  • 谢谢你。但是在这里,在您展示的代码示例中,如何设置创建的向量的值?
  • @ZeusM:检查我的编辑,我添加了对您有帮助的问题的链接。
【解决方案3】:

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

【讨论】:

  • 谢谢。真的很感激。
猜你喜欢
  • 2011-08-14
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 2020-05-20
  • 2017-06-01
  • 2019-04-19
  • 2013-05-02
相关资源
最近更新 更多