C++實現對稱矩陣以及壓縮存儲

#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;
}

程序運行結果


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章