我研究了两种不同的方法来为矩阵的元素分配内存
方法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秒)?
Codepad拒绝显示输出(超时),所以如果你想运行它,只需自己编译即可。
另外,为什么cout&lt;&lt;程序启动后不会执行语句吗?
答案 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_;
};