C ++内存分配。矩阵

时间:2013-02-17 22:20:29

标签: c++ memory dynamic matrix allocation

我研究了两种不同的方法来为矩阵的元素分配内存

方法n.1

int** matrix = new int*[rows];
for (int i = 0; i < rows; ++i)
    matrix[i] = new int[cols];

方法n.2

int** matrix = new int*[rows];
if (rows)
{
    matrix[0] = new int[rows * cols];
    for (int i = 1; i < rows; ++i)
        matrix[i] = matrix[0] + i * cols;
}

我可以弄清楚方法n.1做了什么,但是我无法弄清楚究竟应该在方法n.2中做什么if子句(我会在没有它的情况下实现它,它不起作用, if子句,它确实...)

编辑:这是显示我的问题的代码。为什么加载需要这么长时间(~30秒)?

http://codepad.org/uKvI8Tk3

Codepad拒绝显示输出(超时),所以如果你想运行它,只需自己编译即可。

另外,为什么cout&lt;&lt;程序启动后不会执行语句吗?

2 个答案:

答案 0 :(得分:5)

方法n.3:编写自己的Matrix类,在内部使用单个std::vector<int>并且聪明地通过(row,col)索引进行访问。

struct Matrix
{
  explicit Matrix(unsigned int rows, unsigned int cols) : data_(rows*cols), cols_(cols) {}
  const int& operator()(unsigned int row, unsigned int col) const
  {
    return data_[row*cols_ + col];
  }
 private:
  std::vector<int> data_;
  unsigned int cols_;
};

编辑: iff 向量的内存开销是上一个示例中的一个问题,您可以考虑使用一个长度为rows*cols的动态分配的数组,并确保调用{在析构函数中使用{1}}。

答案 1 :(得分:2)

方法n.2分配一个唯一的块来包含所有行的序列。因此第一行是指向整个块的指针。如果rows == 0,则没有空间来保存指向(空)空间的指针,因此无法进行分配。

我会转向另一个答案中建议的方法4:

class Matrix {
   Matrix(int rows, int cols): rows_(rows), cols_(cols) {
      data_ = new int[rows*cols];
   }

   ~Matrix() {
       delete[] data_;
   }

   int &operator()(int i,int j) {return data_[cols_*i+j];}

   int operator()(int i,int j) const {return data_[cols_*i+j];}

 private:
   int rows_,cols_;
   int *data_;
};