📄 matirx_stl_许磊.cpp
字号:
#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>
#include<functional>
using namespace std;
template <class T> // 定义的一个输出的仿函数
class print{
public:
void operator() (vector<T> elem) const
{
copy(elem.begin(),elem.end(),ostream_iterator<T>(cout," "));
cout<<endl;
}
};
template <class T>
class matrix{
int le; //矩阵的行数
int lt; // 矩阵的列数
vector< vector<T> > line ; //存储矩阵元素的向量
public:
matrix(int,int) ; //带参数的构造函数声明
matrix(); //不带参数的构造函数声明
void show() ; //显示矩阵的成员函数声明
T value(int a,int b); // 能返回矩阵的每个元素的成员函数声明
vector<T> lvalue(int c); // 能返回矩阵的每行的成员函数声明
matrix<T> tran(); //矩阵转置的成员函数声明
void operator = (matrix<T> ob) ; //矩阵赋值的成员函数声明
matrix<T> operator + (matrix<T> ob) ; //矩阵加法的成员函数声明
matrix<T> operator - (matrix<T> ob); //矩阵减法的成员函数声明
matrix<T> operator * (matrix<T> ob); //矩阵乘法的成员函数声明
};
template <class T>
matrix<T>::matrix(int i,int j) //带参数的构造函数
{
le=i;lt=j;
cout<<"生成 "<<i<<"行 "<<j<<"列 "<<"的Matrix "<<endl;
vector<T> list(j);
cout<<"请按行依次输入Matrix的每个元素: 如键入第一行元素( 1 2 …… 2)后按回车键"<<endl;
list.clear();
line.reserve(20);
int m=0;
while(m<i)
{
for(int k=0;k<j;++k)
{ T a;
cin>>a;
list.push_back(a);
}
cout<<"第"<<m<<"行元素输入完毕 "<<endl;
m++;
line.push_back(list);
list.clear();
}
}
template <class T>
matrix<T>::matrix() //不带参数的构造函数
{ }
template <class T>
void matrix<T>::show() //显示矩阵的成员函数
{ cout<<"矩阵输出"<<endl;
for_each(line.begin(),line.end(),print< T >());
}
template <class T>
T matrix<T>::value(int a,int b) //能返回矩阵的每个元素
{
return line[a][b];
}
template <class T>
vector<T> matrix<T>::lvalue(int c) // 能返回矩阵的每行
{
return line[c];
}
template <class T>
matrix<T> matrix<T>:: tran() //转置矩阵
{ matrix<T> n; //通过无参的构造函数生成的临时对象
n.le=lt;
n.lt=le;
int i,j;
i=le;j=lt;
vector<T> list(i);
list.clear();
int m=0;
while(m<j)
{
for(int k=0;k<i;++k)
{
list.push_back(line[k][m]);
}
m++;
n.line.push_back(list);
list.clear();
}
cout<<endl<<"转置矩阵 "<<endl;
for_each(n.line.begin(),n.line.end(),print<T>());
return n; //返回临时对象
}
template <class T> //矩阵赋值的成员函数
void matrix<T>:: operator = (matrix<T> ob)
{
le=ob.le;
lt=ob.lt;
line=ob.line;
}
template <class T>
matrix<T> matrix<T>:: operator + (matrix<T> ob) //矩阵的加法
{
if((le!=ob.le)||(lt!=ob.lt)) cout<<endl<<"两矩阵不能进行相加"<<endl;
else
{
matrix<T> m; //通过无参的构造函数生成的临时对象
m.le=ob.le;
m.lt=ob.lt;
vector<T> col; //存放向量加法运算的和向量
vector<T> col1; //存放参加向量加法运算的由this指针传递的行向量
vector<T> col2; //存放参加向量加法运算的参数对象的行向量
for(int i=0;i<le;++i)
{
col1=lvalue(i);
col2=ob.lvalue(i);
transform(col1.begin(), col1.end(),col2.begin(),back_inserter(col),plus<T>());
m.line.push_back(col);
col.clear();
col1.clear();
col2.clear();
}
cout<<endl<<"求和矩阵:"<<endl;
//for_each(m.line.begin(),m.line.end(),print<T>());
return m; //返回上面定义的临时对象
}
matrix<T> n; //定义一个能够返回的临时对象
return n;
}
template <class T>
matrix<T> matrix<T>:: operator - (matrix<T> ob) //矩阵减法
{
if((le!=ob.le)||(lt!=ob.lt)) cout<<endl<<"两矩阵不能进行相减"<<endl;
else
{ matrix<T> m;
m.le=ob.le;
m.lt=ob.lt;
vector<T> col; //存放向量减法运算的差向量
vector<T> col1; //存放参加向量减法运算的由this指针传递的行向量
vector<T> col2; //存放参加向量减法运算的参数对象的行向量
for(int i=0;i<le;++i)
{
col1=lvalue(i);
col2=ob.lvalue(i);
transform(col1.begin(), col1.end(),col2.begin(),back_inserter(col),minus<T>());
m.line.push_back(col);
col.clear();
col1.clear();
col2.clear();
}
cout<<endl<<"求差矩阵:"<<endl;
/*for_each(m.line.begin(),m.line.end(),print<T>());*/
return m; //返回上面定义的临时对象
}
matrix<T> n; //定义一个能够返回的临时对象
return n;
}
template <class T>
matrix<T> matrix<T>:: operator * (matrix<T> ob) //矩阵的乘法
{
if(lt!=ob.le) cout<<endl<<"两矩阵不能进行相乘"<<endl;
else
{ matrix<T> m; //通过无参的构造函数生成的临时对象
m.le=le;
m.lt=ob.lt;
vector<T> list;
T col;
for(int i=0;i<le;++i)
{ for(int j=0;j<ob.lt;++j)
{ col=0;
for(int k=0;k<lt;++k)
{
T col1=value(i,k);
T col2=ob.value(k,j);
col+=col1*col2;
}
list.push_back(col);
}
m.line.push_back(list);
list.clear();
}
cout<<endl<<"求积矩阵: "<<endl;
/* for_each(m.line.begin(),m.line.end(),print<T>());*/
return m; //返回上面定义的临时对象
}
matrix<T> n; //定义一个能够返回的临时对象
return n;
}
int main()
{
cout<<endl<<"//************实现matrix类中的显示和转置功能******************************////"<<endl;
cout<<" float型矩阵"<<endl;
matrix<float> a(2,2); //定义了一个浮点型的矩阵对象
a.show(); //矩阵的显示
a.tran(); //矩阵的转置
cout<<" int型矩阵"<<endl;
matrix<int> b(2,3); //定义了一个整型的矩阵对象
b.show();
b.tran();
cout<<" char型矩阵"<<endl;
matrix<char> c(3,2); //定义了一个字符型的矩阵对象
c.show();
c.tran();
cout<<endl<<"//…………………………………………………………………………………………………////"<<endl;
cout<<endl<<"//****************实现matrix类中的加法功能********************************////"<<endl;
cout<<" float型矩阵"<<endl;
matrix<float> d(3,4);
d.show();
matrix<float> e(3,4);
e.show();
(d+e).show();
matrix<float> f(3,4);
f.show();
(d+e+f).show();
matrix<float> g(4,4);
g.show();
f+g;
cout<<endl<<"//……………………………………………………………………………………………////"<<endl;
cout<<endl<<"//****************实现matrix类中的减法功能*****************************////"<<endl;
cout<<" float型矩阵"<<endl;
(d-e).show();
(d-e-f).show();
f-g;
cout<<endl<<"//……………………………………………………………………………………………////"<<endl;
cout<<endl<<"//*****************实现matrix类中的乘法功能*****************************////"<<endl;
cout<<" float型矩阵"<<endl;
matrix<float> h(3,4);
h.show();
matrix<float> i(4,3);
i.show();
(h*i).show();
matrix<float> j(3,2);
j.show();
(h*i*j).show();
matrix<float> k(4,4);
k.show();
j*k;
cout<<endl<<"//……………………………………………………………………………………………////"<<endl;
cout<<endl;
cout<< " done by 许磊 软件12"<<endl;
char q;
cout<<"输入一字符结束显示.";
cin>>q;
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -