Biblioteka VTL, czyli C++ z widokiem na dane.
Jakiś czas temu dotarłem do biblioteki VTL. Nadarzyła się wreszcie okazja, żeby napisać o niej kilka słów.
Biblioteka VTL (ang. View Template Library) dostępna pod adresem www.zib.de/weiser/vtl/download.html otwiera nam drogę w kierunku łatwego wykonywania zarówno prezentacji zbioru danych jak i ich przetwarzania. Posługiwanie się nią przypomina operowanie kontenerami z biblioteki STL.
Ogólna koncepcja, czyli czym są widoki i co je cechuje?
Widoki są obiektami-kolekcjami operującymi na pojedynczym kontenerze lub 2-ch kontenerach danych (są to 2 odrębne modele koncepcyjne). Każdy widok posiada metody dostępu do danych, a w szczególności skojarzony typ iteratorowy. Analogicznie jak w bibliotece STL, iteratory umożliwiają przeglądanie elementów widoku.
Ważne jest to, że bazowy kontener (czy też obydwa) z danymi jest niemodyfikowalny. Widok możemy zadeklarować jako mutable lub immutable przekazując w parametrze wzorca klasy właściwy parametr. Modyfikacja danych w widoku (jeśli taka zostanie dopuszczona) nigdy nie wpłynie wartości źródłowe. Widok możemy utworzyć zarówno poprzez nałożenie zwykłego filtru danych (np.: dane w zadanym przedziale czasu), bądź też poprzez transformację (np.: wybór skali logarytmicznej).
Kolejną istotną własnością jest brak gwarancji na stałą ściśle określona kolejność elementów (która de facto może być inna w kolejnych iteracjach po widoku).
Czym dysponuje biblioteka ?
W bibliotece można znaleźć przeróżne modele widoków podzielone na kilka grup:
- widoki jednokontenerowe
- widoki dla prostych kontenerów
- widoki dla kontenerów, których składowymi są pary uporządkowane np.: std::map
- widoki dwukontenerowe
- widoki dla posortowanych kontenerów
- widoki dla nieposortowanych kontenerów
- widoki operujące na zakresach
Jeśli chodzi o możliwości to można znaleźć tu kilka przydatnych rzeczy:
- filtry oparty na predykacie => wartość pochodząca z wykonania predykatu jest wyznacznikiem czy dany element źródłowy znajdzie się w widoku
- filtry flagowy => zamiast predykatu użyty jest równoległy kontener flag, których wartość określa czy element ma pojawić się w widoku
- widok transformacyjny => każda wartość kontenera źródłowego poddana jest przetworzeniu przez obiekt transformujący
- filtr unikatowości => z kontenera źródłowego wybierane są elementy unikatowe (można podać własny mechanizm porównujący iteratory)
- widok odwrotny
- widok typu okno =>stały rozmiar, możliwość usytuowania okna w dowolnym miejscu kontenera źródłowego (autoadaptacja)
- widok typu unia 2-ch kontenerów
- widok typu iloczyn kartezjański 2-ch kontenerów
- widok typu różnica 2-ch kontenerów
- widok typu część wspólna 2-ch kontenerów
- widok typu różnica symetryczna (XOR) 2-ch kontenerów
- widok powstające przez złożenie (ZipView) 2-ch kontenerów
Więcej szczegółów możesz znaleźć tutaj.
Pozdrawiam Cię,
życze miłej lektury i ciekawych eksperymentów z biblioteką.
Najświeższe komentarze