行数:rows
列数:cols
索引 (x, y) :第x行第y列的元素 ----- 区别于图像矩阵
封装一维数组作为二维数组类
template<typename T>
class Matrix2D {
public:
Matrix2D(int m, int n, const T val) {
cols = n;
arr = new T[m * n]; // 申请空间(连续)
for (int i = 0; i < m * n; ++i) {
arr[i] = val; // 初始化
}
}
~Matrix2D() {
delete[] arr; // 释放空间
}
T &at(int x, int y) { // 元素索引
return arr[cols * x + y];
}
private:
T *arr;
int cols;
};
示例:
int m(5), n(4);
Matrix2D<int> mat(m, n, -1);
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cout << mat.at(i, j) << ", ";
}
cout << endl;
}
new/delete (推荐)
动态申请:
int** mat = new int *[rows]; // 开辟行
for (int i = 0; i < rows; ++i) // 开辟列
mat[i] = new int[cols](); // 内置类型只能初始化为 0
元素索引:
int val = mat[x][y]
释放空间:
for (int i = 0; i < rows; ++i)
delete[] mat[i];
delete[] mat;
STL::vector
动态申请:
int val = -1; // 初值
std::vector<std::vector<int >> mat(rows, std::vector<int>(cols, val));
元素索引:
int val = mat[x][y]
不需要手动释放?但是 mat[i].clear()
函数只是清空了元素值,申请的空间还在,而且是只增不减、成倍扩容,只有在作用域结束才自动释放。需要手动释放 vector 内存空间的可以参考:用swap()函数释放vector内存
malloc/free
动态申请:
int** mat = (int**) malloc(sizeof(int*) * rows); // 开辟行
for (int i = 0; i < rows; i++) // 开辟列
mat[i] = (int*) malloc(sizeof(int) * cols); // 不能同时初始化
元素索引:
int val = mat[x][y]
释放空间:
for(i = 0; i < m;i++)
free(mat[i]);
free(mat);
遇到的问题
在练习做题时,new/delete 动态数组在Debug模式下发生如下错误:系统资源不足,无法完成请求的服务,而在Release模式下相安无事。但是vector 二维数组没有任何问题,Debug/Release都能正常运行。我又尝试了在CLion中运行,则没有发生错误。初步判断是VS的Debug模式中包含了大量的调试信息,使得计算机资源耗尽。