什么是稀疏矩阵呢,就是在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