Matrix

10 marca 2009

Kiedyś, prawie rok temu kombinowałem coś z dwuwymiarowymi tablicami dynamicznymi.

W projekcie xime, lista kontaktów wykorzystuje prostą implementację takowej tablicy opartą na małym rozszerzeniu standardowego wektora. Tablica ta odzwierciedla widoczne w danej chwili w kontrolce elementy, zawiera wskaźniki, bądź proste elementy z wskaźnikami do elementów kontaktów umieszczonych w powiązanym drzewie, coś w stylu B-tree.

Idea działania tablicy jest dokładnie taka, jaką opisano w wspomnianej notce, jako ostatnie rozwiązanie.

Miałem ostatnio chwilkę, to poprawiłem i doprowadziłem do porządku kod tablicy dwuwymiarowej używany w xime, aby można było go wykorzystać w dowolnym innym miejscu.

Podobnie jak poprzednio opisywany vector_ptr, klasa matrix dostępna jest na projects.malcom.pl, na licencji MIT. Mam nadzieje, ze komuś również się przyda w prostym projekcie.

Do bardziej zaawansowanych operacji warto zaznajomić się z podobnymi kontenerami z biblioteki boost.

Wracając do tematu mojego matrixa.

Poniżej przykład jak można byłoby zaimplementować w niestandardowym wykonaniu algorytm for_each, do operowania na wszystkich elementach kolejki. Ważne jest, aby umożliwić wykonanie jakiś obliczeń lub operacji pomiędzy przetwarzaniem poszczególnych wierszy, dlatego funktor przyjmuje następującą postać:

template<typename T>
class MatrixFunctor {
public:
	PreRowProcess() {}
	void operator()(const T& item) {}
	PostRowProcess() {}
};

Wtedy sam algorytm wyglądałby tak:

template<typename Matrix, class Fn>
Fn for_each(Matrix& m, Fn func) {
 
	Matrix::iterator first = m.begin();
	Matrix::iterator row   = m.begin();
	Matrix::iterator last  = m.end();
 
	while (first != last) {
		row += m.size_cols();
		func.PreRowProcess();
 
		while (first != row) {
			func(*first);
			++first;
		}
 
		func.PostRowProcess();
	}
 
	return func;
}

W implementacji listy kontaktów xime nie wykorzystuje podobnych algorytmów, tam każda operacja na jakimś zakresie elementów kontenera ma własną ręcznie pisaną pętle, głownie dostosowana do danej sytuacji. W niektórych sytuacjach zmiana na ogólniejszy algorytm pogorszyłaby wydajność. Może nie zauważalnie, ale na pewno dodatkowe klasy z funktorami zaciemniłyby kod i ideę jego działania.

Może następnym razem, jak wrócę z Warszawy, uda mi się uporządkować kod tej struktury powiązanych drzewem list w stylu B-tree.

Podobne notatki:

Może zainteresują Cię również następujące, pododbne notatki:

Nikt jeszcze nie skomentował tego wpisu.
Możesz być pierwszy.

Dodaj swój komentarz

Możesz użyć tych tagów XHTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Jeśli chcesz wstawić kilku linijkowy fragment kodu, użyj tagów <pre lang="x"></pre> (gdzie x język kodu np. cpp, perl, html). W ten sposób kod zostanie odpowiednio sformatowany i pokolorowany przez system.

Uwaga!

Na tym blogu działa system cache oraz filtr antyspamowy. Twój komentarz może być widoczny na stronie z pewnym opóźnieniem. Proszę o cierpliwość. Jeśli utraciłeś już wszystkie jej zasoby poinformuj mnie o tym, być może system uznał Cię za spamera ;)