对称矩阵的一大特点就是a[i][j] == a[j][i], 可以简单地看作是两个三角形,关于中间一条对角线对称,所以在存储矩阵时,就可以存储一部分,而另一部分可以计算得出。
#include <iostream>
#include <windows.h>
using namespace std;
template<class T>
class SymmetricMatrix
{
public:
SymmetricMatrix(int* a, size_t N)
:_row(N)
,_col(N)
{
_pData = new T[N*(N+1)>>1];
size_t index = 0;
for(size_t i=0; i<N;++i)
{
for(size_t j=0; j<=i;++j)
_pData[index++] = a[i*N+j];
}
}
T& Acess(int row, int col)
{
if(row < col)
std::swap(row, col);
return _pData[row*(row+1)>>1 + col];
}
const T& Acess(int row, int col)const
{
if(row < col)
std::swap(_pData[row], _pData[col]);
return _pData[row*(row+1)>>1 + col];
}
~SymmetricMatrix()
{
if(_pData)
{
delete[] _pData;
_pData = NULL;
}
}
template <class T>
friend ostream& operator<<(ostream& _cout, SymmetricMatrix<T> &s)
{
for(size_t i=0; i<s._row; ++i)
{
for(size_t j=0; j<s._col; ++j)
_cout<<s.Acess(i, j)<<" ";
_cout<<endl;
}
return _cout;
}
private:
T* _pData;
size_t _row;
size_t _col;
};
int main()
{
int arr[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 *)arr, sizeof(arr)/sizeof(arr[0]));
cout<<sm<<endl;
system("pause");
return 0;
}