Technologie programowania Wykład 4. Szablony funkcji Notes. Szablony funkcji Notes. Szablony funkcji Notes. Notes. Przemek Błaśkiewicz.

Podobne dokumenty
Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Kurs programowania. Wykład 9. Wojciech Macyna

Wprowadzenie do szablonów szablony funkcji

Programowanie i struktury danych

Wprowadzenie do szablonów szablony funkcji

Szablony funkcji i szablony klas

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Programowanie w C++ Wykład 6. Katarzyna Grzelak. 1 kwietnia K.Grzelak (Wykład 6) Programowanie w C++ 1 / 43

Szablony funkcji i klas (templates)

Paradygmaty programowania

Programowanie w C++ Wykład 7. Katarzyna Grzelak. 23 kwietnia K.Grzelak (Wykład 7) Programowanie w C++ 1 / 40

Wykład 5 Wybrane zagadnienia programowania w C++ (c.d.)

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

STL: Lekcja 1&2. Filozofia STL

Język C++ wykład VIII

Zaawansowane programowanie w języku C++ Biblioteka standardowa

Szablony. Szablony funkcji

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

Aby uzyskać zaliczenie w pierwszym terminie (do 30 stycznia 2018) rozliczyć trzeba co najmniej 8 projektów, po 4 z każdej z części: C++ oraz Python.

Język C++ Różnice między C a C++

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 7 maja K.Grzelak (Wykład 8) Programowanie w C++ 1 / 31

Wprowadzenie do szablonów klas

Obsługa wyjątków. Język C++ WW12

Programowanie w języku C++

Projektowanie klas c.d. Projektowanie klas przykład

Algorytmy i Struktury Danych.

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Programowanie w C++ Wykład 6. Katarzyna Grzelak. kwiecień K.Grzelak (Wykład 6) Programowanie w C++ 1 / 40

Paradygmaty programowania. Paradygmaty programowania

Dla każdej operacji łącznie tworzenia danych i zapisu ich do pliku przeprowadzić pomiar czasu wykonania polecenia. Wyniki przedstawić w tabelce.

Zaawansowane programowanie w języku C++ Funkcje uogólnione - wzorce

Programowanie obiektowe. Wykład 5. C++: szablony

Klasy generyczne. ZbiórLiczb. ZbiórCzegokolwiek. Zbiór

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { zdefiniuje. Integer::operator=(ri);

Szablony klas, zastosowanie szablonów w programach

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Język C++ część 9 szablony klas. Jarosław Gramacki Instytut Informatyki i Elektroniki. szablony funkcji

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Wyjątki (exceptions)

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Jzyk C++ cz 3. Jarosław Gramacki Instytut Informatyki i Elektroniki ( $)*)+' *, - ( ' )*'.' '',*/ *, ','*0) 1 / ) %*+ 2'' 2" ( $%%) )'20 )*0) 1 / )

Abstrakcyjny typ danych

TEMAT : KLASY POLIMORFIZM

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Wstęp do programowania

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

Functionalization. Funkcje w C. Marcin Makowski. 30 listopada Zak lad Chemii Teoretycznej UJ

Wstęp do Programowania 2

Wykład 3 Składnia języka C# (cz. 2)

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

Wykład 4: Klasy i Metody

Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006)

Stos liczb całkowitych

Programowanie Komponentowe Zarządzanie obiektami: kontenery

Zaawansowane programowanie w C++ (PCP)

Operatory na rzecz typu TString

Języki i paradygmaty programowania Wykład 2. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/18

Wstęp do Programowania 2

Programowanie obiektowe

Programowanie i struktury danych

Wstęp do programowania

Technologie cyfrowe semestr letni 2018/2019

Wstęp do programowania obiektowego, wykład 7

Technologie cyfrowe semestr letni 2018/2019

Przesłanianie nazw, przestrzenie nazw

Język C++ wykład VI. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VI. dr Jarosław Mederski.

Podstawy programowania w języku C++

public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje

2.4 Dziedziczenie. 2.4 Dziedziczenie Przykłady programowania w C - kurs podstawowy

Podstawy programowania obiektowego

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 5. Karol Tarnowski A-1 p.

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27

Tablice. Monika Wrzosek (IM UG) Podstawy Programowania 96 / 119

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Programowanie 2. Język C++. Wykład 2.

W przypadku STL w specyfikacji nazwy pliku nagłówkowego brak rozszerzenia tj. <string> <string.h> zamiast

Rzutowanie i konwersje

Wykład 1. Program przedmiotu. Programowanie (język C++) Literatura. Program przedmiotu c.d.:

FUNKCJE WZORCOWE. Wykład 10. Programowanie Obiektowe (język C++) Funkcje wzorcowe wprowadzenie (2) Funkcje wzorcowe wprowadzenie (1)

PARADYGMATY PROGRAMOWANIA Wykład 4

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

I - Microsoft Visual Studio C++

obiekty funkcyjne - funktory

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Programowanie 2. Język C++. Wykład 3.

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

10.1 Szablony Szablony funkcji Szablony klas Szablony jako wstęp do biblioteki STL... 10

Transkrypt:

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