witam,
implementuje klase do przechowywania macierzy rzadkiej tak jak
ponizej; nie moge sobie poradzic z przeladowaniem operatora() do
odczytu i zapisu wartosci macierzy
prosze o pomoc i z gory dziekuje za wszelka okazana
PS. Klasa moze miec inaczej skonstruowane pola do przechowywania
macierzy, byle nie na mapie bo takowa juz zrobilem i dziala :)
Potrzebuje teraz dla odmiany czegos innego
pzdr.
#include <iostream>
#include <vector>
#include <stdexcept>
using namespace std;
template <class T>
class SparseMatrixIdx {
public:
SparseMatrixIdx() : rows_(0), cols_(0) {}
SparseMatrixIdx(size_t m, size_t n) : rows_(m),
cols_(n) {}
SparseMatrixIdx(const SparseMatrixIdx &m);
// odczyt
T operator()(size_t row, size_t col) const;
// zapis
T& operator()(size_t row, size_t col);
// zwraca liczbe wierszy macierzy
inline size_t GetRows() const { return rows_; }
// zwraca liczbe kolumn macierzy
inline size_t GetCols() const { return cols_; }
private:
vector<size_t> rowidx;
vector<size_t> colidx;
vector<T> val;
size_t rows_;
size_t cols_;
}; // end of: class SparseMatrixIdx
template <class T>
T SparseMatrixIdx<T>::operator()(size_t row, size_t col) const {
// odczyt
check_range(row, col);
typename vector<size_t>::iterator r_it(rowidx.begin());
typename vector<size_t>::iterator c_it(colidx.begin());
typename vector<T>::iterator v_it(val.begin());
while(r_it != rowidx.end()) {
if(*r_it == row) {
if(*c_it == col) {
return(*v_it);
}
}
++r_it;
++c_it;
++v_it;
}
return T();
}
template <class T>
T& SparseMatrixIdx<T>::operator()(size_t row, size_t col) {
// zapis
check_range(row, col);
typename vector<size_t>::iterator r_it(rowidx.begin());
typename vector<size_t>::iterator c_it(colidx.begin());
typename vector<T>::iterator v_it(val.begin());
while(r_it != rowidx.end()) {
if(*r_it == row) {
if(*c_it == col) {
return val[v_it - val.begin()];
}
if(*c_it > col) {
rowidx.insert(r_it, row);
colidx.insert(c_it, col);
val.insert(v_it, 0);
return val[v_it - val.begin()];
}
}
if(*r_it > row) {
rowidx.insert(r_it, row);
colidx.insert(c_it, col);
val.insert(v_it, 0);
return val[v_it - val.begin()];
}
++r_it;
++c_it;
++v_it;
}
rowidx.push_back(row);
colidx.push_back(col);
val.insert(v_it, 0);
return val[v_it - val.begin()];
}