C++实现稀疏矩阵的压缩存储

什么是稀疏矩阵呢,就是在M*N的矩阵中,有效值的个数远小于无效值的个数,并且这些数据的分布没有规律。在压缩存储稀疏矩阵的时候我们只存储极少数的有效数据。我们在这里使用三元组存储每一个有效数据,三元组按原矩阵中的位置,以行优先级先后次序依次存放。下面我们来看一下代码实现。

#include<iostream>
#include<vector>
#include<assert.h>
using namespace std;

template<class T>
class SparseMatrix
{
	//三元组
	template<class T>
	struct Trituple
	{
		Trituple()//给一个默认构造函数
		{}
		Trituple(size_t row, size_t col, const T& data)
			:_row(row)
			,_col(col)
			,_data(data)
		{}
		size_t _row;
		size_t _col;
		T _data;
	};
public:
	//稀疏矩阵的压缩存储
	SparseMatrix()
	{}
	SparseMatrix(int* arr, size_t row, size_t col, const T& invalid)
		:_row(row)
		,_col(col)
		,_invalid(invalid)
	{
		for(int i = 0; i < row; i++)
		{
			for(int j = 0; j < col; ++j)
			{
				if(arr[i*col+j] != invalid)//将有效值存储在一个一维数组中
				_sm.push_back(Trituple<T>(i,j,arr[i*col+j]));//将三元组的无名对象push进去
			}
		}	
	}
	//访问稀疏矩阵中row行col中的元素
	T& Acess(int row, int col)
	{
		//1、
		/*for(int idx = 0; idx < _sm.size(); idx++)//遍历一遍
		{
			if(_sm[idx]._row == row && _sm[idx]._col == col)//当前行列与我们要访问那个元素行列相同时返回这个有效值
				return _sm[idx]._data;
		}
		return _invalid;*/ //否则返回无效值
		//2、
		vector<Trituple<T>>::iterator it = _sm.begin();//定义一个迭代器,指向起始位置
		while(it != _sm.end())//未到最后一个元素时
		{
			if(it->_row == row && it->_col == col)//行列相等输出值
				return it->_data;
			++it;//迭代器向后移动
		}
		return _invalid;
	}
	//还原稀疏矩阵
	templat
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值