行数: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模式中包含了大量的调试信息,使得计算机资源耗尽。