Programowanie w C++ Wykład 7 Katarzyna Grzelak 23 kwietnia 2018 K.Grzelak (Wykład 7) Programowanie w C++ 1 / 40
Standard Template Library (STL) K.Grzelak (Wykład 7) Programowanie w C++ 2 / 40
C++ Templates (Szablony) - wstęp Problem Funkcje: ten sam algorytm, ale różne dane wejściowe. Możliwe rozwiazanie Przeładowanie nazw funkcji K.Grzelak (Wykład 7) Programowanie w C++ 3 / 40
Przeładowanie nazw funkcji Przykład K.Grzelak (Wykład 7) Programowanie w C++ 4 / 40
C++ Templates (Szablony) Cel Funkcja (lub klasa) zdefiniowana niezależnie od typów zmiennych których używa. Rozwiazanie Szablony (templates) K.Grzelak (Wykład 7) Programowanie w C++ 5 / 40
Szablony funkcji (function templates) Definicja Niekompletna funkcja Brakuje części informacji: Sparametryzowane typy zmiennych K.Grzelak (Wykład 7) Programowanie w C++ 6 / 40
Szablony funkcji (function templates) Przykład template<typename T> void zamiana (T &a,t &b) Równoważny zapis (mylący): template<class T> void zamiana(t &a,t &b) Szablon funkcji reprezentuje nieskończona liczbę funkcji: K.Grzelak (Wykład 7) Programowanie w C++ 7 / 40
Szablon funkcji Przykład K.Grzelak (Wykład 7) Programowanie w C++ 8 / 40
STL STL Standard Template Libarary standardowa biblioteka szablonów Składowe biblioteki: 1 Pojemniki (kontenery) 2 Iteratory 3 Algorytmy K.Grzelak (Wykład 7) Programowanie w C++ 9 / 40
1) Pojemniki STL Pojemniki służa do przechowywania grup obiektów Vector Set Deque List Map K.Grzelak (Wykład 7) Programowanie w C++ 10 / 40
1) Pojemniki STL Pojemniki sekwencyjne: pozycja elementu w pojemniku zależy od czasu i miejsca gdzie został wstawiony, a nie zależy od jego wartości. Rodzaje: vector (wektor-tablica) deque (kolejka) list (lista) K.Grzelak (Wykład 7) Programowanie w C++ 11 / 40
1) Pojemniki STL Pojemniki asocjacyjne: aktualna pozycja elementu w pojemniku zależy od jego wartości set,multiset (zbiór) map,multimap (słownik) K.Grzelak (Wykład 7) Programowanie w C++ 12 / 40
2) Iteratory STL Iteratory służa do poruszania się po pojemnikach Iteratory działaja jak wskaźniki Nie tylko dla sekwencyjnych pojemników! (smart pointers) Zwykły wskaźnik z języka C++ jest iteratorem K.Grzelak (Wykład 7) Programowanie w C++ 13 / 40
3) Algorytmy STL Algorytmy to szablony funkcji sort search count replace... Algorytmy STL działaja dla każdego pojemnika. K.Grzelak (Wykład 7) Programowanie w C++ 14 / 40
Dygresja - nazewnictwo Metoda to funkcja działajaca na rzecz konkretnego obiektu. Składnia w kropka, przykład: string nazwa; cout «nazwa.size() «endl; Powyżej size() jest metoda z klasy string K.Grzelak (Wykład 7) Programowanie w C++ 15 / 40
1) Pojemniki STL Vector Set Deque List Map K.Grzelak (Wykład 7) Programowanie w C++ 16 / 40
1) Pojemniki STL To który pojemnik wybrać, zależy od problemu który rozwiazujemy. K.Grzelak (Wykład 7) Programowanie w C++ 17 / 40
1) Pojemniki STL - vector vector plik nagłówkowy #include<vector> dynamiczna tablica operator indeksowania [] lub metoda at() szybkie dodawanie(push_back()) i usuwanie(pop_back()) elementów na końcu wektora K.Grzelak (Wykład 7) Programowanie w C++ 18 / 40
1) Pojemniki STL - vector vector możliwe stworzenie pustego wektora i rozszerzanie go (zmniejszanie) na bieżaco najszybciej działa, jeśli z góry zarezerwujemy obszar pamięci metoda reserve() K.Grzelak (Wykład 7) Programowanie w C++ 19 / 40
1) Pojemniki STL - deque deque (double ended queue) plik nagłówkowy #include<deque> dynamiczna tablica operator indeksowania [] lub metoda at() szybkie dodawanie i usuwanie elementów na obu końcach: metody: push_back(), pop_back(), push_front(), pop_front() K.Grzelak (Wykład 7) Programowanie w C++ 20 / 40
1) Pojemniki STL - list list plik nagłówkowy #include<list> brak indeksowania! szybkie dodawanie i usuwanie elementów nie tylko na obu końcach, ale także w środku listy (metody: insert() i erase()). K.Grzelak (Wykład 7) Programowanie w C++ 21 / 40
1) Pojemniki STL - set set,multiset (zbiór) plik nagłówkowy #include<set> elementy automatycznie sortowane (względem wartości) każdy element może się pojawić w pojemniku set tylko raz multiset to samo co set, ale dany element może pojawić się więcej niż raz K.Grzelak (Wykład 7) Programowanie w C++ 22 / 40
1) Pojemniki STL - set set,multiset (zbiór) implementacja - zbalansowane drzewa binarne szybkie przeszukiwanie 7 4 9 2 5 8 11 1 3 6 10 12 K.Grzelak (Wykład 7) Programowanie w C++ 23 / 40
1) Pojemniki STL - map map,multimap (słownik) plik nagłówkowy #include<map> zawiera pary elementów: (klucz, wartość) elementy automatycznie sortowane (względem klucza) każdy klucz może się pojawić w pojemniku map tylko raz multimap to samo co map, ale dany klucz może pojawić się wiecej niż raz K.Grzelak (Wykład 7) Programowanie w C++ 24 / 40
1) Pojemniki STL - map map,multimap (słownik) implementacja - zbalansowane drzewa binarne szybkie przeszukiwanie elementów majacych określony klucz 7 y 4 y 9 x 2 y 5 q 8 y 11 w 1 x 3 z 6 y 10 q 12 z K.Grzelak (Wykład 7) Programowanie w C++ 25 / 40
2) Iteratory do poruszania się po pojemnikach, także tych o bardziej skomplikowanej strukturze operator * operator ++ operator ==!= operator = Zwykły wskaźnik jest iteratorem K.Grzelak (Wykład 7) Programowanie w C++ 26 / 40
2) Iteratory metoda begin() metoda end() begin() end() K.Grzelak (Wykład 7) Programowanie w C++ 27 / 40
2) Algorytmy Plik nagłówkowy #include<algorithm> Algorytmy działaja dla dowolnego pojemnika Globalne funkcje które działaja z iteratorami Algorytmy działaja dla zwykłych tablic K.Grzelak (Wykład 7) Programowanie w C++ 28 / 40
Przykład użycie zwykłych tablic + wskaźników + algorithm Algorytmy działaja dla zwykłych tablic Część 1 przykładowego programu - nagłówki K.Grzelak (Wykład 7) Programowanie w C++ 29 / 40
Przykład użycie zwykłych tablic + wskaźników + algorithm Algorytmy działaja dla zwykłych tablic Część 2 przykładowego programu - main K.Grzelak (Wykład 7) Programowanie w C++ 30 / 40
Przykład użycie zwykłych tablic + wskaźników + algorithm Część 3 przykładowego programu - funkcje K.Grzelak (Wykład 7) Programowanie w C++ 31 / 40
Więcej o pojemniku vector K.Grzelak (Wykład 7) Programowanie w C++ 32 / 40
vector Plik nagłówkowy #include<vector> Stworzenie pustego pojemnika do przechowywania obiektów typu int: vector<int> vec; Stworzenie pojemnika do przechowywania 10 obiektów typu double: vector<double> vec(10); Stworzenie pojemnika do przechowywania 10 obiektów typu double i inicjalizacja zerami vector<double> vec(10,0.); Iterator do poruszania się po pojemniku vector: vector<double>::iterator pos; K.Grzelak (Wykład 7) Programowanie w C++ 33 / 40
Metody dla wektora vector<int> vec; vec.push_back() - dodawanie elementu na końcu wektora vec.pop_back() - usuwanie elementu z końca wektora vec.size() - zwraca liczbę elementów vec.at(i) - zwraca element o indeksie i (sprawdzanie czy prawidłowy indeks) vec[i] - zwraca element o indeksie i (bez sprawdzania czy prawidłowy indeks) vec.clear() - usuwa wszystkie elementy K.Grzelak (Wykład 7) Programowanie w C++ 34 / 40
vector - Przykład bez iteratorów Nie zadziała, gdybyśmy chcieli zmienić vector na inny pojemnik. K.Grzelak (Wykład 7) Programowanie w C++ 35 / 40
vector - Przykład 2 bez iteratorów Nie zadziała, gdybyśmy chcieli zmienić vector na inny pojemnik. K.Grzelak (Wykład 7) Programowanie w C++ 36 / 40
vector - Przykład z iteratorami Bardziej uniwersalne. K.Grzelak (Wykład 7) Programowanie w C++ 37 / 40
vector - Przykład z algorytmem sortowania K.Grzelak (Wykład 7) Programowanie w C++ 38 / 40
Na koniec przykład użycia pojemnika map K.Grzelak (Wykład 7) Programowanie w C++ 39 / 40
Podsumowanie STL = pojemniki + iteratory + algorytmy K.Grzelak (Wykład 7) Programowanie w C++ 40 / 40