C++内存分配.矩阵

C++ Memory allocation. Matrix

本文关键字:矩阵 分配 内存 C++      更新时间:2023-10-16

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

方法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子句的情况下实现它,但它不起作用,有if子句时,它起作用…)

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

http://codepad.org/uKvI8Tk3

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

此外,为什么cout<lt;程序启动后不执行语句?

方法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的动态分配数组,并确保在析构函数中对其调用delete []

方法n.2正在分配一个唯一的块来包含所有行的序列。因此,第一行是指向整个块的指针。如果行==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_;
};