Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Standard Template Library. Książki o STL i bibliotece standardowej C++ Nicolai M. Josuttis: C++ Standard Library: A tutorial and Reference, 1st, Pearson.

Podobne prezentacje


Prezentacja na temat: "Standard Template Library. Książki o STL i bibliotece standardowej C++ Nicolai M. Josuttis: C++ Standard Library: A tutorial and Reference, 1st, Pearson."— Zapis prezentacji:

1 Standard Template Library

2 Książki o STL i bibliotece standardowej C++ Nicolai M. Josuttis: C++ Standard Library: A tutorial and Reference, 1st, Pearson 1999, Nicolai M. Josuttis: C++ Standard Library: A tutorial and Reference, 1st, Pearson 1999, przykłady: (Polska wersja: Nicolai M. Josuttis: C++ Biblioteka standardowa Podręcznik Programisty, Helion 2003, przykłady: ftp://ftp.helion.pl/przyklady/cpbspp.zip) (Polska wersja: Nicolai M. Josuttis: C++ Biblioteka standardowa Podręcznik Programisty, Helion 2003, przykłady: ftp://ftp.helion.pl/przyklady/cpbspp.zip) Nicolai M. Josuttis: C++ Standard Library: A tutorial and Reference, 2nd, Addison Wesley Longman 2012, (uwzględnia standard C++11) Nicolai M. Josuttis: C++ Standard Library: A tutorial and Reference, 2nd, Addison Wesley Longman 2012, (uwzględnia standard C++11) Grębosz J.: Pasja C++, RM, W-wa Grębosz J.: Pasja C++, RM, W-wa Inne (wspomniane na pierwszym wykładzie o C++, w tym ANSI/ISO C++ standard) Inne (wspomniane na pierwszym wykładzie o C++, w tym ANSI/ISO C++ standard)

3 Biblioteka standardowa języka C++ Biblioteka zawiera Biblioteka zawiera klasy strumieniowe klasy strumieniowe klasy łańcuchowe klasy łańcuchowe STL Standard Template Library (największa i najintensywniej rozwijana część biblioteki) STL Standard Template Library (największa i najintensywniej rozwijana część biblioteki) Dawniej używano nagłówków (obsolete): *.h, *.hpp, *.hxx Dawniej używano nagłówków (obsolete): *.h, *.hpp, *.hxx Znacząco rozszerzona w standardzie C++11 (głównie część STL) Znacząco rozszerzona w standardzie C++11 (głównie część STL) Rozszerzenia języka i bibliotek C++11 nie są jeszcze w pełni wspierane przez kompilatory; wykład o C++11 na przedmiocie MiNWO poświęcony będzie nowemu standardowi C++ Rozszerzenia języka i bibliotek C++11 nie są jeszcze w pełni wspierane przez kompilatory; wykład o C++11 na przedmiocie MiNWO poświęcony będzie nowemu standardowi C++

4 STL Główne składniki Główne składniki Kontenery (listy, wektory, etc.) Kontenery (listy, wektory, etc.) Iteratory (interfejs pomiędzy algorytmami a kontenerami) Iteratory (interfejs pomiędzy algorytmami a kontenerami) Algorytmy (proste, nie bardziej skomplikowane od wyszukiwania i sortowanie) Algorytmy (proste, nie bardziej skomplikowane od wyszukiwania i sortowanie) Inne (obiekty funkcyjne, adaptory,...) Inne (obiekty funkcyjne, adaptory,...) STL to biblioteka wzorców! STL to biblioteka wzorców! Dane odseparowane od metod (a co z ideą OOP?) Dane odseparowane od metod (a co z ideą OOP?) Zaprojektowane dla programowania wysokopoziomowego Zaprojektowane dla programowania wysokopoziomowego Zaprojektowane dla programowania wydajnego Zaprojektowane dla programowania wydajnego

5 BTW: rząd złożoności algorytmu O-notacja O-notacja Wyszukiwanie w posortowanej tablicy:O(log 2 (n)) Wyszukiwanie w posortowanej tablicy:O(log 2 (n)) Wyszukiwanie w nieuporządkowanej tablicy: O(n) Wyszukiwanie w nieuporządkowanej tablicy: O(n) quicksort:O(n · log 2 (n)) quicksort:O(n · log 2 (n)) Sortowanie bąbelkowe:O(n 2 ) Sortowanie bąbelkowe:O(n 2 )

6 Kontenery Sekwencyjne Sekwencyjne vector (tablica dynamiczna) vector (tablica dynamiczna) dequeue (tablica dynamiczna dwukierunkowa) dequeue (tablica dynamiczna dwukierunkowa) list (lista dwukierunkowa) list (lista dwukierunkowa) (tablica i string nie są kontenerami STL, ale można je przetwarzać za pomocą algorytmów STL) (tablica i string nie są kontenerami STL, ale można je przetwarzać za pomocą algorytmów STL) Asocjacyjne Asocjacyjne set (drzewo binarne) set (drzewo binarne) multiset multiset map, multimap map, multimap

7 Kontenery vector vector Zaimplementowany jako tablica dynamiczna Zaimplementowany jako tablica dynamiczna szybkie push_back() szybkie push_back() szybki operator[] szybki operator[] wolne insert() wolne insert()

8 Kontenery deque deque Zaimplementowany jako tablica dynamiczna Zaimplementowany jako tablica dynamiczna szybkie push_back() (vector może być szybszy) szybkie push_back() (vector może być szybszy) szybkie push_front() (nieobsługiwany przez vector) szybkie push_front() (nieobsługiwany przez vector) szybki operator[] szybki operator[] wolny insert() wolny insert()

9 Kontenery list list Zaimplementowana jako lista dwukierunkowa Zaimplementowana jako lista dwukierunkowa szybkie push_back() szybkie push_back() szybkie push_front() szybkie push_front() szybkie insert() szybkie insert() Nie ma operatora operator[] Nie ma operatora operator[]

10 Iteratory Iteratory zachowują się jak zwyczajne wskaźniki... Iteratory zachowują się jak zwyczajne wskaźniki... * -> * -> ==!= ==!= = (vector, deq: -,, +(int) ) (vector, deq: -,, +(int) ) Ale działają dla wszystkich kontenerów! Ale działają dla wszystkich kontenerów! container.begin()// zwróć iterator do pierwszego elementu. container.begin()// zwróć iterator do pierwszego elementu. container.end()//... do ostatniego container.end()//... do ostatniego przykład: list2.cpp przykład: list2.cpp

11 Kontenery set set Zaimplementowany jako drzewo binarne Zaimplementowany jako drzewo binarne Sowrtowanie przy wstawianiu (porównywanie domyślnym operatorem<() ) Sowrtowanie przy wstawianiu (porównywanie domyślnym operatorem<() ) Odpowiednik zbiorów matematycznych Odpowiednik zbiorów matematycznych metoda find() metoda find() szybkie insert() szybkie insert() nie ma: push_back() nie ma: push_back() nie ma: push_front() nie ma: push_front() nie ma: operatora [] nie ma: operatora []

12 Kontenery multiset multiset Dozwolone powtórzenia tej samej wartości Dozwolone powtórzenia tej samej wartości Uporządkowanie wewnątrz grupy elementów o tych samych wartościach jest niezdefiniowane Uporządkowanie wewnątrz grupy elementów o tych samych wartościach jest niezdefiniowane

13 Kontenery multimap multimap multiset dla par: klucz, wartość – użyj make_pair() multiset dla par: klucz, wartość – użyj make_pair()

14 Kontenery map map set dla par: klucz, wartość – użyj make_pair() set dla par: klucz, wartość – użyj make_pair() Tylko dla kontenera map: operator[key]() Tylko dla kontenera map: operator[key]() Indeksowanie wartością (tablica asocjacyjna) Indeksowanie wartością (tablica asocjacyjna)

15 Algorytmy STL Operują na kontenerach za pomocą iteratorów Operują na kontenerach za pomocą iteratorów Sposób uniwersalny, ale nie tak szybki jak metody kontenerów Sposób uniwersalny, ale nie tak szybki jak metody kontenerów Dla niektórych kombinacji algorytm/kontener wolne Dla niektórych kombinacji algorytm/kontener wolne Możliwe jednoczesne działanie na kontenerach różnych typów Możliwe jednoczesne działanie na kontenerach różnych typów Tylko podstawowe, proste algorytmy Tylko podstawowe, proste algorytmy Parametryzowalne przez romaite iteratory Parametryzowalne przez romaite iteratory Parametryzowalne przez obiekty funkcyjne i adaptory Parametryzowalne przez obiekty funkcyjne i adaptory Nie intuicyjne (eufemizm) Nie intuicyjne (eufemizm)

16 Algorytmy STL Przykład: algo1.cpp Przykład: algo1.cpp min_element// operator<() min_element// operator<() max_element// operator<() max_element// operator<() sort// operator<() sort// operator<() find// operator==() find// operator==() reverse// operator=() reverse// operator=() min_element (coll.begin(), coll.end()) min_element (coll.begin(), coll.end()) Zakres to [ coll.begin(), coll.end() ) (przykład: find1.cpp) Zakres to [ coll.begin(), coll.end() ) (przykład: find1.cpp) Właściwa definicja zakresu to zadanie programisty Właściwa definicja zakresu to zadanie programisty Koniec zakresu powinien być osiągany przez ++owanie początku Koniec zakresu powinien być osiągany przez ++owanie początku Co gdy nie mamy pewności co jest końcem a co początkiem? Co gdy nie mamy pewności co jest końcem a co początkiem?

17 Algorytmy STL copy (coll1.begin(), coll1.end(), coll2.begin()); copy (coll1.begin(), coll1.end(), coll2.begin()); Koniec zakresu podany tylko dla pierwszego zakresu Koniec zakresu podany tylko dla pierwszego zakresu Rozmiar zakresu docelowego musi być wystarczający Rozmiar zakresu docelowego musi być wystarczający Algorytm przeprowadza wyłącznie proste nadpisywanie Algorytm przeprowadza wyłącznie proste nadpisywanie … bez sprawdzania rozmiaru zakresu docelowego (iteratory to interfejs do elementów kontenera, nie do kontenera) … bez sprawdzania rozmiaru zakresu docelowego (iteratory to interfejs do elementów kontenera, nie do kontenera) Właściwy rozmiar kolekcji to odpowiedzialność/zadanie programisty (przykład: copy2.cpp) Właściwy rozmiar kolekcji to odpowiedzialność/zadanie programisty (przykład: copy2.cpp) Dla niektórych kontenerów (sekwencyjne) ustawienie rozmiaru początkowego jest proste Dla niektórych kontenerów (sekwencyjne) ustawienie rozmiaru początkowego jest proste

18 Iteratory STL Wielkość zakresu musi być wystarczająca, albo... Wielkość zakresu musi być wystarczająca, albo... copy (coll1.begin(), coll1.end(), inserter(coll2, coll2.begin()) );... albo użyj iteratorów wstawiających (inserter) ;) (copy3.cpp)... albo użyj iteratorów wstawiających (inserter) ;) (copy3.cpp) inserter dla wszystkich kontenerów, które mają metodę insert() inserter dla wszystkich kontenerów, które mają metodę insert() Wstawia przed podaną lokalizacją Wstawia przed podaną lokalizacją Dla kontenerów asocjacyjnych lokalizacja jest tylko wskazówką Dla kontenerów asocjacyjnych lokalizacja jest tylko wskazówką back_inserter dla kontenerów, które mają metodę push_back() back_inserter dla kontenerów, które mają metodę push_back() front_inserter dla kontenerów, które mają metodę push_front() front_inserter dla kontenerów, które mają metodę push_front()

19 Iteratory STL Iteratory strumieniowe Iteratory strumieniowe Zachowują się jak zwyczajne iteratory Zachowują się jak zwyczajne iteratory Mają interfejs zwykłych iteratorów Mają interfejs zwykłych iteratorów Operują na strumieniach i/o (ioiter1.cpp) Operują na strumieniach i/o (ioiter1.cpp) istream_iterator (cin) istream_iterator (cin) ++iter dla stream>>temp, *iter aby pobrać temp ++iter dla stream>>temp, *iter aby pobrać temp istream_iterator () istream_iterator () Iterator końca srtumienia (zakresu strumienia) Iterator końca srtumienia (zakresu strumienia)

20 Iteratory STL Iteratory odwrotne (reverse iterator) Iteratory odwrotne (reverse iterator) Mają interfejs zwykłych iteratorów Mają interfejs zwykłych iteratorów Zachowują się odwrotnie (rter1.cpp) Zachowują się odwrotnie (rter1.cpp) container.rbegin() wskazuje na ostatni element (nie pozycję po ostatnim) container.rbegin() wskazuje na ostatni element (nie pozycję po ostatnim) container.rend() wskazuje na pozycję przed pierwszym! container.rend() wskazuje na pozycję przed pierwszym! ++ to --, -- to ++, itd. ++ to --, -- to ++, itd.

21 Algorytmy STL Usuwanie elementów z kontenera Usuwanie elementów z kontenera Algorytm remove(...) Algorytm remove(...) Tak naprawdę nie usuwa zawartości kontenera (remove1.cpp) Tak naprawdę nie usuwa zawartości kontenera (remove1.cpp) Nie ma dostępu do kontenera, a tylko do elementów Nie ma dostępu do kontenera, a tylko do elementów Nie działa dla kontenerów asocjacyjnych Nie działa dla kontenerów asocjacyjnych Zwraca nowy koniec zakresu (element następny po ostatnim) Zwraca nowy koniec zakresu (element następny po ostatnim) Użyj metody kontener.erase(...) by się pozbyć elementów (remove2.cpp) Użyj metody kontener.erase(...) by się pozbyć elementów (remove2.cpp) Wiele wersji Wiele wersji Działa dla kontenerów asocjacyjnych (remove3.cpp) Działa dla kontenerów asocjacyjnych (remove3.cpp)

22 Rozszerzanie STL Programista może (a nawet powinien) rozszerzać funkcjonalność STL Programista może (a nawet powinien) rozszerzać funkcjonalność STL Tworzyć nowe wzorce, lub klasy/funkcje Tworzyć nowe wzorce, lub klasy/funkcje przykład: print.hpp przykład: print.hpp Słowo kluczowe typename oznacza że argument jest typem Słowo kluczowe typename oznacza że argument jest typem W przeciwieństwie do mutable to jest użyteczne W przeciwieństwie do mutable to jest użyteczne

23 Funkcja jako argument algorytmu Funkcje jednoargumentowe Funkcje jednoargumentowe przykłady: foreach1.cpp, transform1.cpp przykłady: foreach1.cpp, transform1.cpp Predykaty Predykaty Jeden argument i wynik bool (przykład: prime1.cpp) Jeden argument i wynik bool (przykład: prime1.cpp) Dwa argumenty i wynik bool (przykład: sort1.cpp) Dwa argumenty i wynik bool (przykład: sort1.cpp)

24 Obiekt funkcyjny jako argument algorytmu Obiekty funkcyjne Obiekty funkcyjne Zachowują się jak funkcje, ale wykorzystują operator()() Zachowują się jak funkcje, ale wykorzystują operator()()foreach2.cpp Są obiektami Są obiektami Lepiej optymalizowane przez kompilator Lepiej optymalizowane przez kompilator Mogą posiadać zmienne klasowe, wewnętrzny stan przekazany jako argument konstruktora (add1.cpp) Mogą posiadać zmienne klasowe, wewnętrzny stan przekazany jako argument konstruktora (add1.cpp) Można mieć wiele obiektów funkcyjnych tej samej klasy Można mieć wiele obiektów funkcyjnych tej samej klasy

25 Obiekt funkcyjny jako argument algorytmu Predefiniowane szablony obiektów funkcyjnych Predefiniowane szablony obiektów funkcyjnych less<>, greater <> less<>, greater <> set s; domyślnie oznacza set > s; można również:set > s; można również:set > s; negate<>, multiply<> // do użycia w algorytmie transform(...) negate<>, multiply<> // do użycia w algorytmie transform(...)

26 Adaptory funkcji Definiują przypadki szczególne użycia funkcji Definiują przypadki szczególne użycia funkcji Modyfikują funkcję, gdy wymagany jest inny interfeja (i.e. lista argumentów) Modyfikują funkcję, gdy wymagany jest inny interfeja (i.e. lista argumentów) bind2nd(less (),50) (fo1.cpp) bind2nd(less (),50) (fo1.cpp) Tworzymy domyślny drugi argument Tworzymy domyślny drugi argument

27 Elementy kontenerów Interfejs zawsze wymagany Interfejs zawsze wymagany Konstruktor kopiujący Konstruktor kopiujący Operator przypisania Operator przypisania Destruktor Destruktor Interfejs wymagany czasami Interfejs wymagany czasami Konstruktor domyślny Konstruktor domyślny operator == operator == operator < operator <

28 STL, błędy i wyjątki Zaprojektowana dla maksymalizacji prędkości Zaprojektowana dla maksymalizacji prędkości W przypadku błędnego użycia (np. *end()=something) zachowanie jest niezdefiniowane, miejmy nadzieją że błąd ujawni się wcześnie W przypadku błędnego użycia (np. *end()=something) zachowanie jest niezdefiniowane, miejmy nadzieją że błąd ujawni się wcześnie Ostrożnie z iteratorami i zakresami Ostrożnie z iteratorami i zakresami Tylko minimalne sprawdzenia są realizowane (wyjątek bad_alloc) Tylko minimalne sprawdzenia są realizowane (wyjątek bad_alloc) Jest wersja debug biblioteki Jest wersja debug biblioteki Użyj jej!!! Użyj jej!!! Niektóre metody niektórych kontenerów są transaction-safe Niektóre metody niektórych kontenerów są transaction-safe A niektóre nie są! A niektóre nie są! Sprawdź w dokumentacji! Sprawdź w dokumentacji!


Pobierz ppt "Standard Template Library. Książki o STL i bibliotece standardowej C++ Nicolai M. Josuttis: C++ Standard Library: A tutorial and Reference, 1st, Pearson."

Podobne prezentacje


Reklamy Google