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()];
}