0

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

方法 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 << 语句?

4

2 回答 2

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_;
};

编辑:如果在最后一个示例中向量的内存开销是一个问题,您可以考虑使用单个动态分配的 length 数组rows*cols,并确保delete []在析构函数中调用它。

于 2013-02-17T22:22:58.663 回答
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_;
};
于 2013-02-17T22:30:24.697 回答