1 C++ wykład 13,14,15 (16/23/ ) STL
2 STL STL (ang. Standard Template Library) to standardowa biblioteka wzorców w C++. Wszystkie składniki STL są wzorcami. STL jest rdzeniem biblioteki standardowej C++. Wszystkie identyfikatory w bibliotece standardowej C++ zdefiniowane są w przestrzeni nazw std. Zaleta STL – mnóstwo gotowych szablonów klas pozwalających programować na wyższym poziomie abstrakcji. Wada STL – brak oczywistości (koniecznie czytaj dokumentację)
3 STL Biblioteka STL składa się z kilku modułów:kontenery (sekwencyjne, asocjacyjne), iteratory (dwukierunkowe, z dostępem swobodnym), algorytmy, a także funktory (obiekty funkcyjne, predykaty), łańcuchy, strumienie.
4 Pary Szablon struktury pair<> (zdefiniowany w
5 Ograniczenia liczboweTypy numeryczne posiadają ograniczenia zależne od platformy i są zdefiniowane w szablonie numeric_limits<> (zdefiniowany w
6 Minimum i maksimum Obliczanie wartości minimalnej oraz maksymalnej: template
7 Minimum i maksimum Przykład 1: bool int_ptr_less (int *p, int *q) { return *p<*q; } … int x = 33, y = 44; int *px = &x, *py = &y; int *pmax = std::max(px,py,int_ptr_less); Przykład 2: int i; long l; … l = max(i,l); // BŁĄD // niezgodne typy argumentów l = std::max
8 Zamiana wartości Zamiana dwóch wartości: template
9 Operatory porównywaniaCztery funkcje szablonowe (zdefiniowane w
10 Kontenery Kontenery służą do przechowywania i zarządzania kolekcjami danych. Rodzaje kontenerów: Kontenery sekwencyjne, gdzie każdy element ma określoną pozycję. Na przykład: vector, deque, list. Kontenery uporządkowane (w tym asocjacyjne), gdzie pozycja elementu zależy od jego wartości. Na przykład: set, multiset, map, multimap.
11 Elementy kontenerów Elementy kontenerów muszą spełniać wymagania podstawowe: element musi być kopiowalny (konstruktor kopiujący), element musi być przypisywalny (przypisanie kopiujące), element musi być zniszczalny (publiczny destruktor). W pewnych sytuacjach elementy kontenerów muszą spełniać wymagania dodatkowe: konstruktor domyślny (utworzenie niepustego kontenera), operator porównywania == (wyszukiwanie), operator porównywania < (kryterium sortowania).
12 Semantyka wartości a semantyka referencjiKontenery STL realizują semantykę wartości: tworzą wewnętrzne kopie swoich elementów oraz zwracają kopie tych elementów. Semantykę referencji można zaimplementować samodzielnie za pomocą inteligentnych wskaźników – wskaźniki te mają umożliwiać zliczanie referencji dla obiektów, do których odnoszą się wskaźniki.
13 Kontenery sekwencyjne – wektoryWektor vector<> (zdefiniowany w
14 Kontenery sekwencyjne – kolejki o dwóch końcachKolejka o dwóch końcach deque<> (zdefiniowana w
15 Kontenery sekwencyjne – listyLista list<> (zdefiniowana w ) przechowuje swoje elementy w liście dwukierunkowej.
W listach nie ma swobodnego dostępu do elementów kolekcji. Dołączanie i usuwanie elementów na końcu i na początku listy jest bardzo szybkie, ale dostanie się do elementu ze środka zabiera dużo czasu. Przykład: list
16 Kontenery sekwencyjne – łańcuchy i tabliceObiektów klas łańcuchowych, czyli basic_string<>, string i wstring, można używać jak kontenerów sekwencyjnych. Są one podobne w zachowaniu do wektorów. Innym rodzajem kontenera może być tablica. Nie jest to klasa i nie ma żadnych metod ale konstrukcja STL umożliwia uruchamianie na tablicach różnych algorytmów (tak jak na kontenerach).
17 Kontenery uporządkowaneKontenery uporządkowane wykonują automatycznie sortowanie swoich elementów. Asocjacyjne kontenery uporządkowane przechowują pary klucz-wartość (odpowiednio first i second) i sortowanie następuje po kluczach. Domyślnie elementy lub klucze są porządkowane przy pomocy operatora <. Kontenery uporządkowane są implementowane w postaci zrównoważonych drzew BST (drzewa czerwono-czarne). Wszystkie kontenery uporządkowane posiadają domyślny parametr wzorca służący sortowaniu (domyślnym jest operator <). Rodzaje kontenerów: zbiory set<>, wielozbiory multiset<>, mapy map<> i multimapy multimap<>.
18 Adaptatory kontenerówAdaptatory kontenerów to kontenery wykorzystujące ogólną strukturę innych kontenerów do realizacji pewnych specyficznych potrzeb. Adaptatorami kontenerów są stosy stack<>, kolejki queue<> i kolejki priorytetowe priority_queue<>.
19 Iteratory Iterator to specjalny obiekt, który potafi iterować po elementach kolekcji. Iterator ma zaimplementowaną semantykę wskaźnika – posiada operator wyłuskania elementu *, operatory przechodzenia do elementówsąsiednich ++ i -- oraz operatory porównywania pozycji == i !=. Wszystkie kontenery udostępniają funkcje tworzące iteratory do nawigowania po ich elementach – funkcja begin() zwraca iterator wskazujący na pozycję z pierwszym elementem w kolekcji a funkcja end() zwraca iterator wskazujący pozycję za ostatnim elementem. Każdy kontener definiuje dwa typy iteratorów – kontener::iterator przeznaczony do iterowania po elementach z możliwością odczytu i zapisu oraz kontener::const_iterator przeznaczony do iterowania po elementach tylko z możliwością odczytu.
20 Iteratory Przykład 1: list