#include<iostream>
using namespace std;
///实现对称矩阵以及压缩存储/
template<typename T>
class SymmetricMatrix
{
friend ostream& operator<<(ostream& _cout, SymmetricMatrix<int>& s);//声明一个友元重载输出符号
public:
SymmetricMatrix(int* a, size_t N)//用一个一维数组来存储对称矩阵
:_N(N)
{
int idex = 0;
_pData = new T[N*(N+1)/2];//开辟一个下三角形或上三角形元素个数的空间
for(int i = 0; i < N; i++)
{
for(int j = 0; j <= i; j++)
{
_pData[idex++] = a[i*N + j];//偏移过去一行的元素,用一维数组存储
}
}
}
T& Acess(int row, int col)//访问下三角形中的元素
{
if(col > row)//下三角形元素下标row>col
std::swap(row, col);//不是下三角就横纵坐标互换
return _pData[row*(row+1)/2+col];
}
const T& Acess(int row, int col)const
{
if(col > row)
std::swap(row, col);
return _pData[row*(row+1)/2+col];//返回下三角元素
}
~SymmetricMatrix()
{
if(_pData)
{
delete[] _pData;
_pData = NULL;
_N = 0;
}
}
private:
T* _pData;
size_t _N;
};
ostream& operator<<(ostream& _cout, SymmetricMatrix<int>& s)//输出运算符重载
{
for(int i = 0; i < s._N; i++)
{
for(int j = 0; j < s._N; j++)
_cout<<s.Acess(i,j)<<" ";
_cout<<endl;
}
return _cout;
}
int main()
{
int a[5][5] = {
{0,1,2,3,4},
{1,0,1,2,3},
{2,1,0,1,2},
{3,2,1,0,1},
{4,3,2,1,0}};
SymmetricMatrix<int> sm((int*)a,5);
cout<<sm.Acess(3,0)<<endl;
cout<<sm;
system("pause");
return 0;
}
程序运行结果