Programowanie w C++ Wykład 6 Katarzyna Grzelak 1 kwietnia 2019 K.Grzelak (Wykład 6) Programowanie w C++ 1 / 43
Pojęcia z poprzednich wykładów Tablica to ciag obiektów tego samego typu, zajmujacy ciagły obszar pamięci. Wskaźnik to adres w pamięci gdzie znajduje się dany obiekt. K.Grzelak (Wykład 6) Programowanie w C++ 2 / 43
Pojęcia z poprzednich wykładów Klasyczne tablice: klasyczne tablice (lokalne) tworzone sa na stosie (stack); standard: na etapie kompilacji musi być znana długość tablicy; zakres ważnośći blok. Tablice dynamiczne: dynamiczne tablice tworzone za pomoca operatora new; tworzone sa na stogu (heap); na etapie kompilacji długość tablicy nie musi być znana; nie maja nazwy - dostęp za pomoca wskaźników; zakres ważności - od new do delete. K.Grzelak (Wykład 6) Programowanie w C++ 3 / 43
Standard Template Library (STL) K.Grzelak (Wykład 6) Programowanie w C++ 4 / 43
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 6) Programowanie w C++ 5 / 43
Przeładowanie nazw funkcji Przykład K.Grzelak (Wykład 6) Programowanie w C++ 6 / 43
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 6) Programowanie w C++ 7 / 43
Szablony funkcji (function templates) Definicja Niekompletna funkcja Brakuje części informacji: Sparametryzowane typy zmiennych K.Grzelak (Wykład 6) Programowanie w C++ 8 / 43
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 6) Programowanie w C++ 9 / 43
Szablon funkcji Przykład K.Grzelak (Wykład 6) Programowanie w C++ 10 / 43
STL STL Standard Template Libarary standardowa biblioteka szablonów Składowe biblioteki: 1 Pojemniki (kontenery) 2 Iteratory 3 Algorytmy K.Grzelak (Wykład 6) Programowanie w C++ 11 / 43
1) Pojemniki STL Pojemniki służa do przechowywania grup obiektów Vector Set Deque List Map K.Grzelak (Wykład 6) Programowanie w C++ 12 / 43
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 6) Programowanie w C++ 13 / 43
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 6) Programowanie w C++ 14 / 43
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 6) Programowanie w C++ 15 / 43
3) Algorytmy STL Algorytmy to szablony funkcji sort search count replace... Algorytmy STL działaja dla każdego pojemnika. K.Grzelak (Wykład 6) Programowanie w C++ 16 / 43
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 6) Programowanie w C++ 17 / 43
1) Pojemniki STL Vector Set Deque List Map K.Grzelak (Wykład 6) Programowanie w C++ 18 / 43
1) Pojemniki STL To który pojemnik wybrać, zależy od problemu który rozwiazujemy. K.Grzelak (Wykład 6) Programowanie w C++ 19 / 43
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 6) Programowanie w C++ 20 / 43
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 6) Programowanie w C++ 21 / 43
Więcej o pojemniku vector K.Grzelak (Wykład 6) Programowanie w C++ 22 / 43
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 6) Programowanie w C++ 23 / 43
Metody dla wektora vector<int> vec; vec.push_back(element) - 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 6) Programowanie w C++ 24 / 43
vector - Przykład bez iteratorów Nie zadziała, gdybyśmy chcieli zmienić vector na inny pojemnik. K.Grzelak (Wykład 6) Programowanie w C++ 25 / 43
vector - Przykład 2 bez iteratorów Nie zadziała, gdybyśmy chcieli zmienić vector na inny pojemnik. K.Grzelak (Wykład 6) Programowanie w C++ 26 / 43
Przesyłanie pojemnika vector do funkcji Przykłady deklaracji (prototypów) funkcji : Można tak: double srednia(vector<double> v); Lepiej: double srednia(vector<double> &v); lub w przypadku gdy nie chcemy modyfikować vector a: double srednia(const vector<double> &v); K.Grzelak (Wykład 6) Programowanie w C++ 27 / 43
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 6) Programowanie w C++ 28 / 43
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 6) Programowanie w C++ 29 / 43
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 6) Programowanie w C++ 30 / 43
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 6) Programowanie w C++ 31 / 43
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 6) Programowanie w C++ 32 / 43
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 6) Programowanie w C++ 33 / 43
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 6) Programowanie w C++ 34 / 43
2) Iteratory metoda begin() metoda end() begin() end() K.Grzelak (Wykład 6) Programowanie w C++ 35 / 43
vector - Przykład z iteratorami Bardziej uniwersalne. K.Grzelak (Wykład 6) Programowanie w C++ 36 / 43
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 6) Programowanie w C++ 37 / 43
vector - Przykład z algorytmem sortowania K.Grzelak (Wykład 6) Programowanie w C++ 38 / 43
Przykład użycie zwykłych tablic + wskaźników + algorithm Algorytmy działaja też dla zwykłych tablic (!) Część 1 przykładowego programu - nagłówki K.Grzelak (Wykład 6) Programowanie w C++ 39 / 43
Przykład użycie zwykłych tablic + wskaźników + algorithm Algorytmy działaja też dla zwykłych tablic (!) Część 2 przykładowego programu - main K.Grzelak (Wykład 6) Programowanie w C++ 40 / 43
Przykład użycie zwykłych tablic + wskaźników + algorithm Część 3 przykładowego programu - funkcje K.Grzelak (Wykład 6) Programowanie w C++ 41 / 43
Na koniec przykład użycia pojemnika map K.Grzelak (Wykład 6) Programowanie w C++ 42 / 43
Podsumowanie STL = pojemniki + iteratory + algorytmy K.Grzelak (Wykład 6) Programowanie w C++ 43 / 43