#include
#include
#include
using namespace std;
//三元组
template
struct Triple
{
size_t _row;
size_t _col;
T _value;
};
template
class SparseMatrix
{
public:
SparseMatrix();
SparseMatrix(T* a,size_t row,size_t col,const T& invalid);
SparseMatrix(const SparseMatrix& sm);
SparseMatrix& operator=(const SparseMatrix& sm);
~SparseMatrix();
void Display();
SparseMatrix& Transpose();
SparseMatrix& FastTranspose();
private:
vector> _array;
size_t _rowSize;
size_t _colSize;
T _invalid;
};
template
SparseMatrix::SparseMatrix()
:_rowSize(0)
,_colSize(0)
,_invalid(0)
{}
template
SparseMatrix::SparseMatrix(T* a,size_t row,size_t col,const T& invalid)
:_rowSize(row)
,_colSize(col)
,_invalid(invalid)
{
for(size_t i=0;i<_rowSize;i++)
{
for(size_t j=0;j<_colSize;j++)
{
if(a[i*_colSize+j]!=_invalid)
{
Triple t;
t._row=i;
t._col=j;
t._value=a[i*_colSize+j];
_array.push_back(t);
}
}
}
}
template
SparseMatrix::SparseMatrix(const SparseMatrix& sm)
:_rowSize(sm._rowSize)
,_colSize(sm._colSize)
,_invalid(sm._invalid)
{
for(size_t i=0;i
SparseMatrix& SparseMatrix::operator=(const SparseMatrix& sm)
{
_rowSize=sm._rowSize;
_colSize=sm._colSize;
_invalid=sm._invalid;
for(size_t i=0;i<_sm.array.size(;i++))
{
_array.push_back(sm._array[i]);
}
return *this;
}
template
SparseMatrix::~SparseMatrix()
{}
template
void SparseMatrix::Display()
{
size_t index=0;
for(size_t i=0;i<_rowSize;i++)
{
for(size_t j=0;j<_colSize;j++)
{
if(index<_array.size()&&(_array[index]._row==i)
&&(_array[index]._col==j))
{
cout<<_array[index]._value;
index++;
}
else
{
cout<<_invalid;
}
cout<<" ";
}
cout<
SparseMatrix& SparseMatrix::Transpose()
{
SparseMatrix sm;
for(size_t i=0;i<_colSize;i++)
{
for(size_t index=0;index<_array.size();index++)
{
if(_array[index]._col==i)
{
Triple t;
t._row=_array[index]._col;
t._col=_array[index]._row;
t._value=_array[index]._value;
sm._array.push_back(t);
}
}
}
swap(sm._array,_array);
swap(_rowSize,_colSize);
return *this;
}
//快速转置
template
SparseMatrix& SparseMatrix:: FastTranspose()
{
int* RowCounts=new int[_colSize];//统计转置后每行数据个数 //2 0 2 0 2
int* RowStart=new int[_colSize];//统计转置后每行数据起始位置// new 出的大小为什么是_colSize,必须得是他吗 //是的,用后面的例子解释 0 2 2 4 4
memset(RowCounts,0,sizeof(int)*_colSize);
//初始化 RowCounts
memset(RowStart,0,sizeof(int)*_colSize);
for(size_t index=0;index<_array.size();index++)
{
RowCounts[_array[index]._col]++;
}
//初始化 RowStart
RowStart[0]=0;
for(size_t index=1;index<_colSize;index++)
{
RowStart[index]= RowStart[index-1]+RowCounts[index-1];
}
RowStart[0]=0;
for(int index=0;index<_array.size();index++)
{
Triple t;
t._row=_array[index]._col;
t._col=_array[index]._row;
t._value=_array[index]._value;
}
return *this;
}
void Test1()
{
int a[]={1,0,3,0,5,0,0,0,0,0,0,0,0,0,0,1,0,3,0,5,0,0,0,0,0,0,0,0,0,0,0,};
SparseMatrix sm1(a,6,5,0);
sm1.Display();
SparseMatrixsm2(sm1);
sm2.Display();
SparseMatrixsm3=sm1;
sm3.Display();
}
void Test2()
{
int a[6][5]={
{1,0,3,0,5},
{0,0,0,0,0},
{0,0,0,0,0},
{1,0,3,0,5},
{0,0,0,0,0},
{0,0,0,0,0}
};
SparseMatrix sm1(a[0],6,5,0);
sm1.Display();
SparseMatrix sm2=sm1.Transpose();
sm2.Display();
SparseMatrix sm3=sm1.FastTranspose();
sm3.Display();
}
int main()
{
//Test1();
Test2();
system("pause");
return 0;
}