#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;
}
程序運行結果