// test21.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<iostream>
#include<vector>
#include<iomanip>
using namespace std;
template<class T>
class Matrix;
template <class T>
class Term{//矩陣中每個三元組的元素
public:
Term(int r,int c,T v):row(r),col(c),val(v){}
//private:
int row, col;//元素的行標(biāo),列標(biāo)
T val;//元素的值
friend class Matrix<T>;
};
template <class T>
class Matrix{//矩陣
template<class T>
friend istream& operator>>(istream&, Matrix<T>&);
template<class T>
friend ostream& operator<<(ostream&, Matrix<T>&);
public:
Matrix(){mRow=0, mCol=0, nZeroNum=0;}
private:
vector<Term<T>> vec;
int mRow,mCol;//矩陣的行數(shù),列數(shù)
int nZeroNum;//矩陣中的非零元素個數(shù)
};
template<class T>
istream& operator>>(istream& in, Matrix<T>& m){//輸入矩陣
cout<<"Enter the Row and Col of the Matrix: ";
in>>m.mRow>>m.mCol; //輸入矩陣的行數(shù)和列數(shù)
cout<<"Enter the none Zeor Number of the Matrix: ";
in>>m.nZeroNum;//輸入矩陣的非零元個數(shù)
int r,c;
T v;
int k=m.nZeroNum;
while(k--!=0){
cout<<"Enter the Elements of the Matrix: ";
in>>r>>c>>v;//矩陣中每一個非零元的行標(biāo),列標(biāo)和值
m.vec.push_back(Term<T>(r,c,v));//將元素存到容器中去
}
return in;
}
template<class T>
ostream& operator<<(ostream& out, Matrix<T>& m){//輸出矩陣
//不用STL迭代器,手寫如下
//int k=0;//用于遍歷vec中的每一個值
//for(int i=0;i<m.mRow;i++){
// for(int j=0;j<m.mCol;j++){
// if(m.vec[k].row==i && m.vec[k].col==j)//如果m中vec中的第k個非零元素對應(yīng)行標(biāo)=i,列標(biāo)=j,則輸出該值
// out<<setw(4)<<m.vec[k++].val;
// else
// out<<setw(4)<<"0"; //如果不存在第k個元素,輸出0
// }
// out<<endl;
//}
vector<Term<T>>::iterator iter=m.vec.begin();
while(iter!=m.vec.end()){
for(int i=0;i<m.mRow;i++){
for(int j=0;j<m.mCol;j++){
if(iter->row==i && iter->col==j){
out<<setw(4)<<iter->val;//如果存在非零元素,則打印
iter++;
}
else
out<<setw(4)<<"0";//否則打印0
}
out<<endl;
}
}
return out;
}
int main(){
Matrix<int> m;
cin>>m;
cout<<m;
system("pause");
}
運行結(jié)果如下:
Enter the Row and Col of the Matrix: 3 3
Enter the none Zeor Number of the Matrix: 3
Enter the Elements of the Matrix: 0 0 1
Enter the Elements of the Matrix: 1 1 2
Enter the Elements of the Matrix: 2 2 3
1 0 0
0 2 0
0 0 3