Technologie programowania Wykład 4 Przemek Błaśkiewicz 9 maja 2017 1 / 54 Szablony funkcji Często w programach zachodzi potrzeba użycia funkcji, które co do mechanizmu działaja tak samo, ale różnia się tylko typem parametrów. Kompilator C++ pozwala na stworzenie szablonu funkcji, gdzie parametrem moga być typy danych. Programista koduje przepis na tworzenie rodziny funkcji różniacych się tylko typami parametrów. oszczędność pracy programisty, nie kodu! w prostych programach umieszczane w.cpp, w bardziej złożonych - w.h 2 / 54 Szablony funkcji Często w programach zachodzi potrzeba użycia funkcji, które co do mechanizmu działaja tak samo, ale różnia się tylko typem parametrów. Kompilator C++ pozwala na stworzenie szablonu funkcji, gdzie parametrem moga być typy danych. Programista koduje przepis na tworzenie rodziny funkcji różniacych się tylko typami parametrów. oszczędność pracy programisty, nie kodu! w prostych programach umieszczane w.cpp, w bardziej złożonych - w.h 3 / 54 Szablony funkcji Często w programach zachodzi potrzeba użycia funkcji, które co do mechanizmu działaja tak samo, ale różnia się tylko typem parametrów. Kompilator C++ pozwala na stworzenie szablonu funkcji, gdzie parametrem moga być typy danych. Programista koduje przepis na tworzenie rodziny funkcji różniacych się tylko typami parametrów. oszczędność pracy programisty, nie kodu! w prostych programach umieszczane w.cpp, w bardziej złożonych - w.h 4 / 54
Szablony funkcji Często w programach zachodzi potrzeba użycia funkcji, które co do mechanizmu działaja tak samo, ale różnia się tylko typem parametrów. Kompilator C++ pozwala na stworzenie szablonu funkcji, gdzie parametrem moga być typy danych. Programista koduje przepis na tworzenie rodziny funkcji różniacych się tylko typami parametrów. oszczędność pracy programisty, nie kodu! w prostych programach umieszczane w.cpp, w bardziej złożonych - w.h 5 / 54 Przykład funkcji szablonowej Zamiana wartości 2 void swap (T &a, T &b) { 3 T temp ; 4 temp = a; a = b; b = temp ; 5 } Kompilator interpretuje... 1 // T oznacza int 2 void swap ( int a, int b) { 3 int temp ; 4 temp = a; a = b; b = temp ; 5 } 6 / 54 Przykład funkcji szablonowej Zamiana wartości 2 void swap (T &a, T &b) { 3 T temp ; 4 temp = a; a = b; b = temp ; 5 } Kompilator interpretuje... 1 // T oznacza int 2 void swap ( int a, int b) { 3 int temp ; 4 temp = a; a = b; b = temp ; 5 } 7 / 54 Parametry funkcji szablonowej generowanie skonkretyzowanej funkcji zależy tylko od typu parametrów, a nie od typu zwracanego parametrem szablonu może być dowolny typ danych (wbudowany, klasa), pod warunkiem, że zachowanie się funkcji dla konkretnego typu jest zdefiniowane dla pewnych przypadków kompilator dorabia funkcjonalności dla typów wbudowanych (przykład) możliwe jest użycie większej ilości parametrów: template <class T1, class T2> void do(t1 a, T2 b); jeśli typem kolejnego argumentu jest typ pochodny od już zadeklarowanego (wskaźnik, referencja) - nie ma potrzeby jego deklaracji: template <class T> void abc(t a, T[ ] b); 8 / 54
Parametry funkcji szablonowej generowanie skonkretyzowanej funkcji zależy tylko od typu parametrów, a nie od typu zwracanego parametrem szablonu może być dowolny typ danych (wbudowany, klasa), pod warunkiem, że zachowanie się funkcji dla konkretnego typu jest zdefiniowane dla pewnych przypadków kompilator dorabia funkcjonalności dla typów wbudowanych (przykład) możliwe jest użycie większej ilości parametrów: template <class T1, class T2> void do(t1 a, T2 b); jeśli typem kolejnego argumentu jest typ pochodny od już zadeklarowanego (wskaźnik, referencja) - nie ma potrzeby jego deklaracji: template <class T> void abc(t a, T[ ] b); 9 / 54 Parametry funkcji szablonowej generowanie skonkretyzowanej funkcji zależy tylko od typu parametrów, a nie od typu zwracanego parametrem szablonu może być dowolny typ danych (wbudowany, klasa), pod warunkiem, że zachowanie się funkcji dla konkretnego typu jest zdefiniowane dla pewnych przypadków kompilator dorabia funkcjonalności dla typów wbudowanych (przykład) możliwe jest użycie większej ilości parametrów: template <class T1, class T2> void do(t1 a, T2 b); jeśli typem kolejnego argumentu jest typ pochodny od już zadeklarowanego (wskaźnik, referencja) - nie ma potrzeby jego deklaracji: template <class T> void abc(t a, T[ ] b); 10 / 54 Parametry funkcji szablonowej generowanie skonkretyzowanej funkcji zależy tylko od typu parametrów, a nie od typu zwracanego parametrem szablonu może być dowolny typ danych (wbudowany, klasa), pod warunkiem, że zachowanie się funkcji dla konkretnego typu jest zdefiniowane dla pewnych przypadków kompilator dorabia funkcjonalności dla typów wbudowanych (przykład) możliwe jest użycie większej ilości parametrów: template <class T1, class T2> void do(t1 a, T2 b); jeśli typem kolejnego argumentu jest typ pochodny od już zadeklarowanego (wskaźnik, referencja) - nie ma potrzeby jego deklaracji: template <class T> void abc(t a, T[ ] b); 11 / 54 Parametry funkcji szablonowej generowanie skonkretyzowanej funkcji zależy tylko od typu parametrów, a nie od typu zwracanego parametrem szablonu może być dowolny typ danych (wbudowany, klasa), pod warunkiem, że zachowanie się funkcji dla konkretnego typu jest zdefiniowane dla pewnych przypadków kompilator dorabia funkcjonalności dla typów wbudowanych (przykład) możliwe jest użycie większej ilości parametrów: template <class T1, class T2> void do(t1 a, T2 b); jeśli typem kolejnego argumentu jest typ pochodny od już zadeklarowanego (wskaźnik, referencja) - nie ma potrzeby jego deklaracji: template <class T> void abc(t a, T[ ] b); 12 / 54
Właściwości funkcji szablonowej zmienna static pozostaje właściwa dla konkretnej instancji szablonu (przykład) szablon funkcji nie powinien korzystać ze zmiennych globalnych w przypadku, gdy ogólny opis funkcji szablonowej wymaga modyfikacji dla konkretnych parametrów stosuje się funkcję specjalizowana 2 T max ( const T a, const T b) { 3 return (a > b)? a : b; } 1 // funkcja specjalna dla T = char * 2 char * max ( const char *a, const char *b) { 3 return ( strlen (a) > strlen (b) )? a : b; } 13 / 54 Właściwości funkcji szablonowej zmienna static pozostaje właściwa dla konkretnej instancji szablonu (przykład) szablon funkcji nie powinien korzystać ze zmiennych globalnych w przypadku, gdy ogólny opis funkcji szablonowej wymaga modyfikacji dla konkretnych parametrów stosuje się funkcję specjalizowana 2 T max ( const T a, const T b) { 3 return (a > b)? a : b; } 1 // funkcja specjalna dla T = char * 2 char * max ( const char *a, const char *b) { 3 return ( strlen (a) > strlen (b) )? a : b; } 14 / 54 Właściwości funkcji szablonowej zmienna static pozostaje właściwa dla konkretnej instancji szablonu (przykład) szablon funkcji nie powinien korzystać ze zmiennych globalnych w przypadku, gdy ogólny opis funkcji szablonowej wymaga modyfikacji dla konkretnych parametrów stosuje się funkcję specjalizowana 2 T max ( const T a, const T b) { 3 return (a > b)? a : b; } 1 // funkcja specjalna dla T = char * 2 char * max ( const char *a, const char *b) { 3 return ( strlen (a) > strlen (b) )? a : b; } 15 / 54 Właściwości funkcji szablonowej zmienna static pozostaje właściwa dla konkretnej instancji szablonu (przykład) szablon funkcji nie powinien korzystać ze zmiennych globalnych w przypadku, gdy ogólny opis funkcji szablonowej wymaga modyfikacji dla konkretnych parametrów stosuje się funkcję specjalizowana 2 T max ( const T a, const T b) { 3 return (a > b)? a : b; } 1 // funkcja specjalna dla T = char * 2 char * max ( const char *a, const char *b) { 3 return ( strlen (a) > strlen (b) )? a : b; } 16 / 54
Właściwości funkcji szablonowej zmienna static pozostaje właściwa dla konkretnej instancji szablonu (przykład) szablon funkcji nie powinien korzystać ze zmiennych globalnych w przypadku, gdy ogólny opis funkcji szablonowej wymaga modyfikacji dla konkretnych parametrów stosuje się funkcję specjalizowana 2 T max ( const T a, const T b) { 3 return (a > b)? a : b; } 1 // funkcja specjalna dla T = char * 2 char * max ( const char *a, const char *b) { 3 return ( strlen (a) > strlen (b) )? a : b; } 17 / 54 Właściwości funkcji szablonowej zmienna static pozostaje właściwa dla konkretnej instancji szablonu (przykład) szablon funkcji nie powinien korzystać ze zmiennych globalnych w przypadku, gdy ogólny opis funkcji szablonowej wymaga modyfikacji dla konkretnych parametrów stosuje się funkcję specjalizowana 2 T max ( const T a, const T b) { 3 return (a > b)? a : b; } 1 // funkcja specjalna dla T = char * 2 char * max ( const char *a, const char *b) { 3 return ( strlen (a) > strlen (b) )? a : b; } 18 / 54 Funkcje szablonowe podsumowanie pozwalaja na skrócenie pracy nad podobnymi funkcjonalnościami praca przerzucona na kompilator i linker programista odpowiedzialny za sens implementacji szablonu nie wykluczaja dosłownej definicji funkcji dla konkretnych typów Ale funkcje szablonowe to nie wszystko... 19 / 54 Funkcje szablonowe podsumowanie pozwalaja na skrócenie pracy nad podobnymi funkcjonalnościami praca przerzucona na kompilator i linker programista odpowiedzialny za sens implementacji szablonu nie wykluczaja dosłownej definicji funkcji dla konkretnych typów Ale funkcje szablonowe to nie wszystko... 20 / 54
Klasy szablonowe Tak jak w przypadku funkcji, w programach często pojawiaja się przypadki klas, które różnia się jedynie typami danych, jakie obsługuja. Najczęstszym przypadkiem tego rodzaju jest ten, gdzie potrzebujemy sposobu na przechowywanie elementów (obiektów) w dowolnej, nie znanej z góry ilości. Kontenery W językach obiektowych kontenery służa do przechowywania (dynamicznie) tworzonych obiektów, grupowania ich w logiczne struktury. 21 / 54 Klasy szablonowe Tak jak w przypadku funkcji, w programach często pojawiaja się przypadki klas, które różnia się jedynie typami danych, jakie obsługuja. Najczęstszym przypadkiem tego rodzaju jest ten, gdzie potrzebujemy sposobu na przechowywanie elementów (obiektów) w dowolnej, nie znanej z góry ilości. Kontenery W językach obiektowych kontenery służa do przechowywania (dynamicznie) tworzonych obiektów, grupowania ich w logiczne struktury. 22 / 54 Klasy szablonowe Tak jak w przypadku funkcji, w programach często pojawiaja się przypadki klas, które różnia się jedynie typami danych, jakie obsługuja. Najczęstszym przypadkiem tego rodzaju jest ten, gdzie potrzebujemy sposobu na przechowywanie elementów (obiektów) w dowolnej, nie znanej z góry ilości. Kontenery W językach obiektowych kontenery służa do przechowywania (dynamicznie) tworzonych obiektów, grupowania ich w logiczne struktury. 23 / 54 Klasy parametryzowane typami W językach obiektowych można definiować klasy uogólnione zawierajace pola, których typy sa parametrami, tzw. szablony klas (np. klasy z Standard Template Library). Parametry typów podaje się w nawiasach (<>) po nazwie klasy, odzielajac je od siebie przecinkami. Typem uogólnionym może być klasa, struktura, typ prosty czy inny typ uogólniony. Typem nie jest klasa parametryzowana ale dopiero jej ukonkretnienie z podanymi konkretnymi parametrami. Rozwiazania przyjęte w C++ sprawdzaja poprawność szablonu w większości dopiero podczas kompilacji konkretnej instancji szablonu. 24 / 54
Klasy parametryzowane typami W językach obiektowych można definiować klasy uogólnione zawierajace pola, których typy sa parametrami, tzw. szablony klas (np. klasy z Standard Template Library). Parametry typów podaje się w nawiasach (<>) po nazwie klasy, odzielajac je od siebie przecinkami. Typem uogólnionym może być klasa, struktura, typ prosty czy inny typ uogólniony. Typem nie jest klasa parametryzowana ale dopiero jej ukonkretnienie z podanymi konkretnymi parametrami. Rozwiazania przyjęte w C++ sprawdzaja poprawność szablonu w większości dopiero podczas kompilacji konkretnej instancji szablonu. 25 / 54 Klasy parametryzowane typami W językach obiektowych można definiować klasy uogólnione zawierajace pola, których typy sa parametrami, tzw. szablony klas (np. klasy z Standard Template Library). Parametry typów podaje się w nawiasach (<>) po nazwie klasy, odzielajac je od siebie przecinkami. Typem uogólnionym może być klasa, struktura, typ prosty czy inny typ uogólniony. Typem nie jest klasa parametryzowana ale dopiero jej ukonkretnienie z podanymi konkretnymi parametrami. Rozwiazania przyjęte w C++ sprawdzaja poprawność szablonu w większości dopiero podczas kompilacji konkretnej instancji szablonu. 26 / 54 Klasy parametryzowane typami W językach obiektowych można definiować klasy uogólnione zawierajace pola, których typy sa parametrami, tzw. szablony klas (np. klasy z Standard Template Library). Parametry typów podaje się w nawiasach (<>) po nazwie klasy, odzielajac je od siebie przecinkami. Typem uogólnionym może być klasa, struktura, typ prosty czy inny typ uogólniony. Typem nie jest klasa parametryzowana ale dopiero jej ukonkretnienie z podanymi konkretnymi parametrami. Rozwiazania przyjęte w C++ sprawdzaja poprawność szablonu w większości dopiero podczas kompilacji konkretnej instancji szablonu. 27 / 54 Klasy parametryzowane typami W językach obiektowych można definiować klasy uogólnione zawierajace pola, których typy sa parametrami, tzw. szablony klas (np. klasy z Standard Template Library). Parametry typów podaje się w nawiasach (<>) po nazwie klasy, odzielajac je od siebie przecinkami. Typem uogólnionym może być klasa, struktura, typ prosty czy inny typ uogólniony. Typem nie jest klasa parametryzowana ale dopiero jej ukonkretnienie z podanymi konkretnymi parametrami. Rozwiazania przyjęte w C++ sprawdzaja poprawność szablonu w większości dopiero podczas kompilacji konkretnej instancji szablonu. 28 / 54
Deklarowanie szablonu Słowo kluczowe template 2 class Keep { 3 T storage ; 4 public : 5 void hide (T thing ) { storage = thing ; } 6 T give () { return storage ; } 7 }; Konkretyzacja szablonu 1 Keep <int > a; 2 Keep <string > b; 29 / 54 Deklarowanie szablonu Słowo kluczowe template 2 class Keep { 3 T storage ; 4 public : 5 void hide (T thing ) { storage = thing ; } 6 T give () { return storage ; } 7 }; Konkretyzacja szablonu 1 Keep <int > a; 2 Keep <string > b; 30 / 54 Przykład stos.cpp 1 template <typename T> class ElemStosu { 2 public : 3 T elem ; 4 ElemStosu <T>* nast ; 5 ElemStosu (T elem, ElemStosu <T>* nast ) { 6 this ->elem = elem ; 7 this ->nast = nast ; 8 } 9 }; 10 template <typename T> class Stos { 11 private : 12 ElemStosu <T>* wierzch ; 13 public : 14 Stos () { wierzch = NULL ; } 15 bool empty () { return wierzch == NULL ; } 16 void push (T elem ) { wierzch = new ElemStosu <T>( elem, wierzch ); } 17 T pop () { 18 if( empty () ) throw ( string )" PustyStos!"; 19 T wynik = wierzch ->elem ; 20 wierzch = wierzch ->nast ; 21 return wynik ; 22 } 23 }; 31 / 54 Przykład stos.cpp (cd) 24 int main ( int argc, char * argv []) { 25 Stos <int > a; 26 Stos <string > b; 27 a. push (2); a. push (3); 28 try { 29 cout << a. pop () << " " << a. pop () << endl ; 30 cout << a. pop () << " " << a. pop () << endl ; 31 } 32 catch ( string e) { 33 cout << e << endl ; 34 } 35 b. push (" Maciek "); b. push (" Ala "); 36 try { 37 while (!b. empty () ) 38 cout << b. pop () << endl ; 39 } 40 catch ( string e) { 41 cout << e << endl ; 42 } 43 } 32 / 54
Inne przykłady 1 shelf < book * > a; // na fiszki 2 shelf < book [3] > b; // na trylogie 3 shelf < Stos <book > > c; // na balagan 4 shelf < shelf <book > > d; // regal 33 / 54 Parametry szablonu klas Parametrem szablonu może być: nazwa typu wartość całkowita: template <class T, int size = 10> class Arr { T a[size] ;... }; adres obiektu globalnego adres funkcji globalnej: template <class T, int(*ptr)(t,t) > class Sorter {... }; adres statycznego pola lub funkcji klasy 34 / 54 Parametry szablonu klas Parametrem szablonu może być: nazwa typu wartość całkowita: template <class T, int size = 10> class Arr { T a[size] ;... }; adres obiektu globalnego adres funkcji globalnej: template <class T, int(*ptr)(t,t) > class Sorter {... }; adres statycznego pola lub funkcji klasy 35 / 54 Parametry szablonu klas Parametrem szablonu może być: nazwa typu wartość całkowita: template <class T, int size = 10> class Arr { T a[size] ;... }; adres obiektu globalnego adres funkcji globalnej: template <class T, int(*ptr)(t,t) > class Sorter {... }; adres statycznego pola lub funkcji klasy 36 / 54
Parametry szablonu klas Parametrem szablonu może być: nazwa typu wartość całkowita: template <class T, int size = 10> class Arr { T a[size] ;... }; adres obiektu globalnego adres funkcji globalnej: template <class T, int(*ptr)(t,t) > class Sorter {... }; adres statycznego pola lub funkcji klasy 37 / 54 Parametry szablonu klas Parametrem szablonu może być: nazwa typu wartość całkowita: template <class T, int size = 10> class Arr { T a[size] ;... }; adres obiektu globalnego adres funkcji globalnej: template <class T, int(*ptr)(t,t) > class Sorter {... }; adres statycznego pola lub funkcji klasy 38 / 54 Pomocnik: słowo typedef Tworzenie złożonych szablonów prowadzi do bardzo skomplikowanych definicji typów danych, np.: 1 zestaw < shelf <book, int >, 2 sizeof ( book )*1024, browserfun > biblioteka ; Wyobraźmy sobie deklarację funkcji odwiedz( ) dla takiej biblioteki, albo porownaj( ) sprawdzajacej co jest w jednej, a co w drugiej i... zwracajacej nowa bibliotekę! Wprowadzamy nowy typ 1 typedef 2 zestaw < shelf <book, int >, 3 sizeof ( book )*1024, 4 browsefun > 5 bib ; 6 void odwiedz ( bib ); 7 bib porownaj (bib, bib ); 39 / 54 Pomocnik: słowo typedef Tworzenie złożonych szablonów prowadzi do bardzo skomplikowanych definicji typów danych, np.: 1 zestaw < shelf <book, int >, 2 sizeof ( book )*1024, browserfun > biblioteka ; Wyobraźmy sobie deklarację funkcji odwiedz( ) dla takiej biblioteki, albo porownaj( ) sprawdzajacej co jest w jednej, a co w drugiej i... zwracajacej nowa bibliotekę! Wprowadzamy nowy typ 1 typedef 2 zestaw < shelf <book, int >, 3 sizeof ( book )*1024, 4 browsefun > 5 bib ; 6 void odwiedz ( bib ); 7 bib porownaj (bib, bib ); 40 / 54
Pomocnik: słowo typedef Tworzenie złożonych szablonów prowadzi do bardzo skomplikowanych definicji typów danych, np.: 1 zestaw < shelf <book, int >, 2 sizeof ( book )*1024, browserfun > biblioteka ; Wyobraźmy sobie deklarację funkcji odwiedz( ) dla takiej biblioteki, albo porownaj( ) sprawdzajacej co jest w jednej, a co w drugiej i... zwracajacej nowa bibliotekę! Wprowadzamy nowy typ 1 typedef 2 zestaw < shelf <book, int >, 3 sizeof ( book )*1024, 4 browsefun > 5 bib ; 6 void odwiedz ( bib ); 7 bib porownaj (bib, bib ); 41 / 54 Zastosowania szablonów Zalety Wady Tworzenie klas które przechowuja inne obiekty (kontenery), np. tablice, kolejki, stosy, listy... Łatwe tworzenie klas które posługuja się innymi typami danych (alternatywa do pisania wielokrotnie podobnego kodu dla różnych typów danych). Krótszy łatwiejszy kod, operacje bezpieczniejsze niż rzutowanie typów. Kiepska diagnostyka błędów błędy sa często zgłaszane dopiero po konkretyzacji danego szablonu, najczęściej oznajmiajac, że pewne operacje sa niemożliwe dla konkretnego typu (sam szablon nie sprawdza poprawności użycia typu uogólnionego). 42 / 54 Zastosowania szablonów Zalety Wady Tworzenie klas które przechowuja inne obiekty (kontenery), np. tablice, kolejki, stosy, listy... Łatwe tworzenie klas które posługuja się innymi typami danych (alternatywa do pisania wielokrotnie podobnego kodu dla różnych typów danych). Krótszy łatwiejszy kod, operacje bezpieczniejsze niż rzutowanie typów. Kiepska diagnostyka błędów błędy sa często zgłaszane dopiero po konkretyzacji danego szablonu, najczęściej oznajmiajac, że pewne operacje sa niemożliwe dla konkretnego typu (sam szablon nie sprawdza poprawności użycia typu uogólnionego). 43 / 54 Standard Template Library Idea Biblioteka grupujaca klasy (kolekcje) przechowujace/manipuluj ace jakimiś elementami (obiekty lub wartości). Przykładami kolekcji sa zbiór, lista, mapa czy wektor (tablica). Składniki Kontenery - implementacje klas. Algorytmy - operuja na danych ale nie sa zależne od kontenera Iteratory - metody przechodzenia po elementach kontenerów. Kontenery i algorytmy najcześciej współpracuja ze soba za pomoca iteratorów. Pełna dokumentacja http://www.sgi.com/tech/stl/ 44 / 54
Standard Template Library Idea Biblioteka grupujaca klasy (kolekcje) przechowujace/manipuluj ace jakimiś elementami (obiekty lub wartości). Przykładami kolekcji sa zbiór, lista, mapa czy wektor (tablica). Składniki Kontenery - implementacje klas. Algorytmy - operuja na danych ale nie sa zależne od kontenera Iteratory - metody przechodzenia po elementach kontenerów. Kontenery i algorytmy najcześciej współpracuja ze soba za pomoca iteratorów. Pełna dokumentacja http://www.sgi.com/tech/stl/ 45 / 54 Standard Template Library Idea Biblioteka grupujaca klasy (kolekcje) przechowujace/manipuluj ace jakimiś elementami (obiekty lub wartości). Przykładami kolekcji sa zbiór, lista, mapa czy wektor (tablica). Składniki Kontenery - implementacje klas. Algorytmy - operuja na danych ale nie sa zależne od kontenera Iteratory - metody przechodzenia po elementach kontenerów. Kontenery i algorytmy najcześciej współpracuja ze soba za pomoca iteratorów. Pełna dokumentacja http://www.sgi.com/tech/stl/ 46 / 54 Kontenery vector uogólnienie tablicy (dynamiczny rozmiar, dodawanie/usuwanie elementów na końcu/poczatku,...) list implementacja listy/stosu (pokrywa się częściowo z vector, ale dla zastosowań typowo listowych ma szybsza implementację) deque implementacja kolejki (podobnie jak list) set, multiset, hash_set, hash_multiset implementacja zbiorów/multizbiorów map, multimap, hash_map, hash_multimap implementacja odwzorowań funkcyjnych Kontenery odzwierciedlaja pewne konkretne struktury danych używane powszechnie w algorytmach/programach. 47 / 54 Kontenery vector uogólnienie tablicy (dynamiczny rozmiar, dodawanie/usuwanie elementów na końcu/poczatku,...) list implementacja listy/stosu (pokrywa się częściowo z vector, ale dla zastosowań typowo listowych ma szybsza implementację) deque implementacja kolejki (podobnie jak list) set, multiset, hash_set, hash_multiset implementacja zbiorów/multizbiorów map, multimap, hash_map, hash_multimap implementacja odwzorowań funkcyjnych Kontenery odzwierciedlaja pewne konkretne struktury danych używane powszechnie w algorytmach/programach. 48 / 54
Algorytmy i iteratory Podstawowe algorytmy sort uporzadkowanie elementów (jeśli maja porzadek) find szukanie elementu copy kopiowanie struktury generate generowanie struktury o określonych własnościach max, min znajdowanie elementu minimalnego/maksymalnego... Nie wszystkie algorytmy stosuja się do wszystkich kontenerów (np. sortowanie zbioru nie ma sensu). Iteratory Klasy umożliwiajace przechodzenie po elementach kolekcji wskazujace element z kolekcji (np. begin(), end()) 49 / 54 Algorytmy i iteratory Podstawowe algorytmy sort uporzadkowanie elementów (jeśli maja porzadek) find szukanie elementu copy kopiowanie struktury generate generowanie struktury o określonych własnościach max, min znajdowanie elementu minimalnego/maksymalnego... Nie wszystkie algorytmy stosuja się do wszystkich kontenerów (np. sortowanie zbioru nie ma sensu). Iteratory Klasy umożliwiajace przechodzenie po elementach kolekcji wskazujace element z kolekcji (np. begin(), end()) 50 / 54 Przykład lista.cpp 1 # include <iostream > 2 # include <list > 3 # include <string > 4 using namespace std ; 5 int main ( int argc, char * argv []) { 6 list <string > * nazwiska = new list <string >(); 7 nazwiska ->push_back (" Nowak "); nazwiska ->push_back (" Kowalski "); 8 nazwiska ->push_back (" Bielecki "); nazwiska ->push_back (" Adamski "); 9 nazwiska ->push_back (" Kowalski "); 10 list <string >:: iterator it; 11 for (it=nazwiska ->begin (); it!=nazwiska ->end (); it++) 12 cout << " - " << *it << endl ; 13 nazwiska ->sort (); 14 for (it=nazwiska ->begin (); it!=nazwiska ->end (); it++) 15 cout << " + " << *it << endl ; 16 nazwiska ->reverse (); 17 for (it=nazwiska ->begin (); it!=nazwiska ->end (); it++) 18 cout << " - " << *it << endl ; 19 nazwiska ->remove (" Kowalski "); 20 for (it=nazwiska ->begin (); it!=nazwiska ->end (); it++) 21 cout << " + " << *it << endl ; 22 delete ( nazwiska ); 23 } 51 / 54 Implementacja iteratora Przykład: Thinking in C++, vol. 1 http://www.grimstveit.no/bruce_eckel/ 52 / 54
Dodatkowe biblioteki szablonów Boost http://www.boost.org/ Microsoft http://msdn.microsoft.com/en-us/library/y097fkab.aspx 53 / 54 Dodatkowe biblioteki szablonów Boost http://www.boost.org/ Microsoft http://msdn.microsoft.com/en-us/library/y097fkab.aspx 54 / 54