做数据结构的图的作业,感觉每次都要自己去管理动态二维数组,就特地封装了一个矩阵类,实现了一些基本的接口。
今天在编辑博客的时候又想到说感觉用new 和delete 会限制到这个类的使用,但是又想到要用C风格的malloc 和free ,决定放弃治疗。
看到知乎上一位程序员在头文件中使用了using namespace std; 被批评了,我感觉很害怕,赶快过来看看我写的代码有没有,还好没有,哈哈,代码还是得再三推敲啊。
实际上using namespace std; 是很经常会使用到的,但是,你在头文件,不知不觉地给人家引入了一个命名空间,可能会带来的各种潜在问题。因此最好不要这么做。
今天改了个名字,然后用fill()函数来批量赋初值,效率高了好多。醉了
/*
Name:Matrix
Auther:Elliott Zheng
Date: 2017.12.8
Modified date:2018.1.16
一个很基础的矩阵类,不带任何矩阵操作方法,只能访问矩阵元素,隐藏复杂的指针,帮你省去内存管理这一步,做邻接矩阵的题目应该比较方便
*/
#pragma once
#include<iostream>
template<class Type>
class Matrix
{
private:
Type * * pointer;
int rows;
int cols;
void clean()
{
if (!pointer)
return;
for (int i = 0; i < rows; i++)
delete[] pointer[i];
delete[] pointer;
}
public:
// 行数,列数, 把整个矩阵初始化为一个值
Matrix(int row, int col) :pointer(NULL)
{
Resize(row, col);
}
//额外参数ori是将所有元素置为同一值
Matrix(int row, int col, Type ori) :pointer(NULL)
{
Resize(row, col);
SetAllTo(ori);
}
//拷贝构造函数
Matrix(Matrix& other) :pointer(NULL)
{
Copy(other);
}
//转移构造函数
Matrix(Matrix&& other) :rows(other.rows),cols(other.cols)
{
pointer = other.pointer;
other.pointer = NULL;
}
//拷贝other
void Copy(Matrix& other)
{
if (&other == this)
{
return;
}
clean();
rows = other.rows;
cols = other.cols;
pointer = new int*[rows];
for (int i = 0; i<rows; i++)
{
pointer[i] = new int[cols];
for (int j = 0; j < cols; j++)
{
pointer[i][j] = other.pointer[i][j];
}
}
}
//行数,列数,还有一个可选参数初值
void Resize(int row, int col)
{
clean();
if (row <= 0 || col <= 0)
{
std::cerr << "ERROR:你输入的行数或者列数不对,没有意义,已自动置为1" << std::endl;
}
rows = row <= 0 ? 1 : row;
cols = col <= 0 ? 1 : col;
//防止出现说行数列数为o 或负数
pointer = new int*[rows];
for (int i = 0; i<rows; i++)
pointer[i] = new int[cols];
}
//行数,列数,初值
void Resize(int row, int col, Type ori)
{
Resize(row, col);
SetAllTo(ori);
}
//将所有元素设置为ori
void SetAllTo(Type ori)
{
for (int i = 0; i < rows; i++)
{
fill(pointer[i], pointer[i] + cols, ori);
}
}
int get_rows()
{
return rows;
}
int get_cols()
{
return cols;
}
//比较不推荐,但是你懂我意思吧,其实如果你想要程序跑得通,那这两个函数都不应该出问题,但是数组出问题是很正常的啊
Type* operator[](const int row)
{
if (row >= rows || row < 0)
{
std::cerr << "ERROR:数组访问越界,已自动返回空指针" << endl;
return NULL;
}
else
return pointer[row];
}
//推荐使用函数操作符访问矩阵元素
Type& operator()(const int row, const int col)
{
if (row >= rows || row < 0 || col >= cols || col<0)
{
std::cerr << "ERROR:数组访问越界,已自动返回数组元素[0][0]的引用,请检查程序是否出错" << endl;
return pointer[0][0];
}
else
return pointer[row][col];
}
//析构函数
~Matrix()
{
clean();
}
Matrix<Type>& operator=(Matrix<Type>& other)
{
Copy(other);
return *this;
}
};