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

程序运行结果


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值