10.1 Szablony... 1 10.2 Szablony funkcji... 2 10.3 Szablony klas... 5 10.4 Szablony jako wstęp do biblioteki STL... 10



Podobne dokumenty
Programowanie i struktury danych

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

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

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

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

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

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

STL Standardt Template Library (wprowadzenie)

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

Zaawansowane programowanie w języku C++ Biblioteka standardowa

Język C++ wykład VIII

STL: Lekcja 1&2. Filozofia STL

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

Pojemniki Pojemnik to obiekt, którego zadaniem jest przechowywanie innych obiektów.

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

Biblioteka standardowa C++

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

Kontenery i iteratory. Wykorzystanie kontenerów w praktyce.

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

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

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

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

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

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

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

PARADYGMATY PROGRAMOWANIA Wykład 3

Kurs programowania. Wykład 9. Wojciech Macyna

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30

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

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

Szablon klasy std::list

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

STL: kontenery. Typy kontenerów STL. STL: kontenery. STL: kontenery. STL: kontenery. Typy kontenerów STL. deque (double-ended queue) list

Programowanie 2. Język C++. Wykład Relacje między klasami, klasy zagnieŝdŝone, klasy lokalne

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.

Szablony klas, zastosowanie szablonów w programach

Programowanie Obiektowo Zorientowane w języku C++ Biblioteka STL

Biblioteka STL - wstęp. Biblioteka STL - literatura. Biblioteka STL - przegląd. Biblioteka STL - kwestie techniczne

Szablony funkcji i klas (templates)

Do czego służą klasy?

Zaawansowane programowanie w C++ (PCP)

Algorytmy i Struktury Danych.

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

Szablony. Szablony funkcji

Operator przypisania. Jest czym innym niż konstruktor kopiujący!

Języki Programowania. Prowadząca: dr inż. Hanna Zbroszczyk. tel: Konsultacje: piątek:

Paradygmaty programowania

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

obiekty funkcyjne - funktory

Projektowanie klas c.d. Projektowanie klas przykład

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

Informatyka 2. Informatyka 2. Wykład nr 1 ( ) Dane podstawowe. - Wydział Elektryczny. Politechnika Białostocka. Program wykładu (1/2)

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

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

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

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

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

Algorytmy i Struktury Danych. Anna Paszyńska

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

PARADYGMATY PROGRAMOWANIA Wykład 2

referencje Wykład 2. Programowanie (język C++) Referencje (1) int Num = 50; zdefiniowano zmienną Num (typu int) nadając jej wartość początkową 50.

C++11. C++ 11 wybrane elementy. C++11: referencje do rvalue C++ 11: C++11: referencje do rvalue. C++11: referencje do rvalue. Referencje do rvalue

Wzorce funkcji (szablony)

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

Programowanie Obiektowe i C++

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

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

Wprowadzenie do szablonów szablony funkcji

STL Standard Template Library

Stos liczb całkowitych

Wstęp do programowania

Zajęcia nr 5 Algorytmy i wskaźniki. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

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

Wprowadzenie do szablonów szablony funkcji

PARADYGMATY PROGRAMOWANIA Wykład 4

Operatory na rzecz typu TString

C++ Przeładowanie operatorów i wzorce w klasach

Wyliczanie wyrażenia obiekty tymczasowe

KLASY cz.1. Dorota Pylak

Programowanie w C++ Wykład 13. Katarzyna Grzelak. 4 czerwca K.Grzelak (Wykład 13) Programowanie w C++ 1 / 26

Programowanie w C++ Wykład 9. Katarzyna Grzelak. 14 maja K.Grzelak (Wykład 9) Programowanie w C++ 1 / 30

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

Programowanie w C++ Wykład 3. Katarzyna Grzelak. 12 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 35

Funkcje przeciążone, konstruktory kopiujące, argumenty domyślne

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

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

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

Plik klasy. h deklaracje klas

Wstęp do Programowania 2

Przeciążenie (przeładowanie nazw) funkcji

Stos LIFO Last In First Out

Wydajność użycia funktorów z biblioteką STL języka C++

Szablony funkcji i szablony klas

Wykład 4. Klasa List Kolejki Stosy Słowniki

ATD. Wykład 8. Programowanie (język C++) abstrakcyjny typ danych. Abstrakcyjne typy danych (ATD) Metody czysto wirtualne. Definicje i uwagi:

typ y y p y z łoż o on o e n - tab a lice c e w iel e owym m ar a o r we, e stru r kt k ury

Do czego służą klasy?

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

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.

Transkrypt:

.1 Szablony... 1.2 Szablony funkcji... 2.3 Szablony klas....4 Szablony jako wstęp do biblioteki STL....1 Szablony Szablony definiują sparametryzowane rodziny klas, funkcji. Szablony deklarujemy i definiujemy za pomocą słowa kluczowego template. Składnia polecenia template: template < parametry_szablonu > definicja_szablonu Zastosowania szablonów: definicja funkcji, które mogą operować na dowolnych typach danych, tzn. argumenty funkcji i zwracany typ moŝe być dowolnego typu, definicja klas, struktur, tablic mogących przechowywać róŝne typy danych. Przykład 1. Składnia szablonu klasy z jednym parametrem. template<class T> class NazwaKlasy ; Przykład 2. Składnia szablonu funkcji. template<parametry szablonu> zwracanytyp nazwafunkcji(lista argumentów) template<class T> T nazwafunkcji(t t) return t; Słowo kluczowe class, oznacza typ parametru szablonu. Typ class moŝna zamienić dowolnym typem danych lub słowem kluczowym typename. 1

.2 Szablony funkcji Szablon funkcji definiuje sparametryzowaną rodzinę funkcji. Przykład 1. Składnia szablonu funkcji. template<parametry szablonu> zwracanytyp nazwafunkcji(lista argumentów) Przykład 2. Funkcja MAX(int, int) zwraca liczbę większą, typu int. Szablon funkcji maxx(const T&, const T&)zwraca liczbę większą dowolnego typu (w-01-template-funmax.cpp). template <class NazwaTypu> NazwaTypu maxx(nazwatypu x, NazwaTypu y) return (x > y)? y : x; ; inline int MAX(int a, int b) return a > b? a : b; template<class T> inline const T& maxx(const T& a, const T& b) return a > b? a : b; void main () double a, b, c; int x =, y =, z; a = 8.33; b = 7.99; c = maxx(a,b); cout << c << endl; z = maxx(x,y); cout << z << endl; z = MAX(x,y); cout << z << endl; 2

Przykład 3. Definicja szablonu funkcji. Do szablonu funkcji moŝna przekazywać wartości o róŝnych typach (w-02-template-argfunkcji.cpp) using namespace std ; template < class tt > tt Funkcja( const tt& ); int Funkcja( const int& ri ) cout << "Funkcja( const int&) " << endl; return ri; double Funkcja( const double & rd ) cout << "Funkcja( const float&)" << endl; return rd; const int ci = 99; const double cd = 3.14; const char cch= 'A'; Funkcja(ci); Funkcja(cd); Funkcja(cCh); template < class tt > tt Funkcja( const tt& rt ) cout << "Funkcja( const tt&)" << endl; return rt; 3

Przykład 4. Definicja szablonu funkcji. Do szablonu funkcji moŝna przekazywać referencje lub wskaźniki róŝnych typów (w-03-template-argfunkcji.cpp) template<typename T> T ftr(const T &x) cout << "\n ftr(const T &) = "; return x; template<typename T> T ftp(const T *pz) cout << "\n ftp(const T *) = "; return *pz; static char f(const char &rc) cout << "\n f(const char &) = "; return rc; static char f(const char *pch) cout << "\n f(const char *) = "; return *pch; char c = 'A'; char *pc = &c; cout << ftr(c); cout << ftp(pc); cout << f(c); cout << f(pc); cout << "\n"; double d = 3.14; double *pd = &d; cout << ftr(d); cout << ftp(pd); cout << "\n"; 4

.3 Szablony klas Szablony klasy definiuje sparametryzowaną rodzinę klas. Przykład 1. Składnia szablonu klasy. template<class T> class NazwaKlasy ; Przykład 2. Definicja szablonu klasy. Konstruktor, destruktor klasy zdefiniowany jest poza klasą (w-04-template-klasa.cpp). template <class t> class A A(); ~A(); ; template <class t> A<t>::A() cout << "A()" << endl; template <class t> A<t>::~A()cout << "~A()" << endl; A<int> ai ; A<double> ad ; Przykład 3. Definicja szablonu klasy. Typ atrybutu klasy zaleŝy deklaracji obiektu (w-0-template-atrybuttypuintdouble.cpp). template <class T> class A A() cout << "A()" << endl; ; ~A() cout << "~A()" << endl; ; T x; ; A<int> ai; //tworzenie obiektu typu A<int> ai.x = 99; // ai.x = 3.14; // błąd, conversion from 'double' to 'int' A<double> ad; //tworzenie obiektu typu A<double> ad.x = 3.14; // ad.x = "3,14"; // błąd, cannot convert from 'const char []' to 'double'

Przykład 4. Szablon struktury, sparametryzowany zbiór struktur (w-06-template-getset.cpp). template<class T> struct W private: T* in; void set(t* x) in = x; T get() cout << "get(), in= "; return *in; ; W<double> w; double d = 3.14; w.set(&d); cout << w.get() << endl; Przykład. Definicja szablonu tablicy. Przeładowanie operatora [ ] (w-07-template-tablica.cpp). template<class T> class Array static const int size = 0; T A[size]; // przeładowanie operatora [ ] T& operator[](int index) return A[index]; ; int main() Array<int> ia; // definicja tablicy typu int Array<double> da; // definicja tablicy typu double // inicjowanie tablic typu int, double for(int i = 0; i < ; i++) ia[i] = i * i; da[i] = double(i) * 1.414; // przekierowanie na standardowe wyjście wartości elementów tablic for(int j = 0; j < ; j++) cout << j << ": " << ia[j] << ", " << da[j] << endl; 6

Przykład 6. Definicja szablonu klasy. Metoda operuje na atrybucie klasy ( w-08-template-dane.cpp) template <class T> class A A() A(T n); ~A() void pokaz_dane(); protected: T dane; ; template <class T> A<T>::A(T x) : dane(x) template <class T> void A<T>::pokaz_dane() cout << "dane= " << dane << endl; A<int> a(2); a.pokaz_dane(); A<char> b('q'); b.pokaz_dane(); A<double> d(1.2); d.pokaz_dane(); 7

Przykład 7. Definicja szablonu klasy z dwoma parametrami. Metoda operuje na atrybutach klasy (w-09-template-dane.cpp). template <class T1, class T2> class A A() cout << "A()" << endl; A(T1, T2); ~A()cout << "~A()" << endl; void pokaz_dane(); private: T1 dane1; T2 dane2; ; template <class T1, class T2> A<T1, T2> :: A(T1 x, T2 y) : dane1(x), dane2(y) cout << "A(T1,T2)" << endl; template <class T1, class T2> void A<T1, T2>::pokaz_dane() cout << "dane1= " << dane1 << endl; cout << "dane2= " << dane2 << endl; A<int, double> a(,3.); a.pokaz_dane(); 8

Przykład 8. Definicja szablonu klasy. Przeładowanie operatora << klasy ostream (w-09-template-str_out.cpp) class Dane char dane[128]; int i; double d; ; ostream& operator << (ostream& str_out, Dane & q) str_out << "q.dane= " << q.dane << endl; str_out << "q.i = " << q.i << endl; str_out << "q.d = " << q.d << endl; return str_out; ; template <class T> class A A(T); void pokaz_d(); private: T d; ; template <class T> A<T>::A(T x): d(x) template <class T> void A<T>::pokaz_d() cout << d << endl; // przeładowany operator << Dane dane="tekst", 00, 21.33; A<Dane> x(dane); x.pokaz_d(); 9

.4 Szablony jako wstęp do biblioteki STL Standard Template Library (biblioteka STL, Standardowa Biblioteka Wzorców) zawiera zdefiniowane struktury danych i algorytmy pozwalające wykonywać operacje na tych strukturach. Biblioteka STL oparta jest na szablonach. Komponenty biblioteki STL: kontenery (containers), stosowane do zarządzania zbiorami obiektów. Kontenery mogą być implementowane jako, tablice (arrays), linkowane listy (linked lists), kolejki, mapy. iteratory (iterators), stosowane do przeszukiwania kontenerów (zbiorów obiektów), przechodzenia między obiektami. algorytmy, określają operacje wykonywane na zawartości kontenerów lub na obiektach. Typy kontenerów: sequence containers (sekwencyjne kontenery), uporządkowane zbiory, w których kaŝdy element zajmuje określone połoŝenie. PołoŜenie elementu w kontenerze zaleŝy od czasu i miejsca wstawienia elementu do kontenera, nie zaleŝy do wartości elementu. associative containers (łączone kontenery), zbiór uporządkowanych elementów, w którym połoŝenie zaleŝy od wartości elementu i algorytmu sortującego. Przykładami zdefiniowanych w STL sekwencyjnych kontenerów są: wektory (vectors), kolejki o dwóch końcach, tzn. obiekty moŝna wstawiać na początku lub na końcu kolejki (deques), listy (lists), tablica stringów. Przykładami zdefiniowanych w STL łączonych kontenerów są: zbiory (sets), multisets, automatyczne sortowanie według określonego algorytmu, mapy (maps), multimaps, elementami są pary (klucz, wartość). Automatyczne sortowanie według określonego algorytmu dla klucza. Predefiniowane w STL specjalne kontenery (container adapters) stos (stack). uporządkowany zbiór elementów, zarządzany według zasady LIFO (last-in-first-out). kolejki (queues), uporządkowany zbiór elementów, zarządzany według zasady FIFO (first-in-first-out). kolejki z priorytetem (priority queues), uporządkowany zbiór elementów, w którym elementy mogą mieć określony priorytet w algorytmie sortowania. Literatura: N. Josuttis, C++ Biblioteka standardowa. Podręcznik programisty, Helion, 03. SGI, Standard Template Library Programmer's Guide, http://www.sgi.com/tech/stl/ A. Stepanov, Notes on Programming, http://www.stepanovpapers.com/notes.pdf D. Musser, G. Derge, A. Saini, C++ Programming with the Standard Template Library, Addison-Wesley, 1998.

Przykład 1. UŜycie list (w--template-lista1.cpp). Metody klasy list uŝyte w programie: size() zwraca liczbę elementów listy. begin()-zwraca iterator wskazujący na pierwszy element listy. end()-zwraca iterator wskazujący na ostatni element listy. pop_front() usuawa element z początku listy. push_front() dodaje element na początek listy. #include <list> typedef list<int> typedef list<int>::iterator IntList; IntListIterator; template<class T, class A> void showlist(const list<t, A>& alist) cout << "size() = " << alist.size() << endl; for (list<t, A>::const_iterator i = alist.begin(); i!=alist.end(); ++i ) cout << *i << endl; IntList listaa(); int j = 0; // wynik // działania // programu size() = 0 1 size() = 4 1 size() = 0 1 for (IntListIterator ia = listaa.begin(); ia!= listaa.end(); ++ia ) *ia = * j++; showlist(listaa); // usun pierwszy element listaa.pop_front(); showlist(listaa); // dodaj nowy element na poczatek listy listaa.push_front(0); showlist(listaa); 11

Przykład 2. UŜycie list (w-11-template-lista2.cpp). #include <list> typedef list<int> typedef list<int>::iterator IntList; IntListIterator; template<class T, class A> void showlist(const list<t, A>& alist) cout << "size() = " << alist.size() << endl; for (list<t,a>::const_iterator i = alist.begin(); i!= alist.end(); ++i) cout << *i << endl; IntList listaa(); int j = 0; for (IntListIterator ia = listaa.begin(); ia!= listaa.end(); ++ia) *ia = * j++; showlist(listaa); IntList j = ; listab(6); for (IntListIterator ib = listab.begin(); ib!= listab.end(); ++ib) *ib = 2 * j--; showlist(listab); IntList listac = listaa; IntList listad = listab; // sklej bez sortowania listaa.merge(listab); showlist(listaa); showlist(listab); // Odwróć kolejnosc elementow w listaa listaa.reverse(); showlist(listaa); // sortuj i sklej listac.sort(); listad.sort(); listac.merge(listad); showlist(listac); showlist(listad); // wynik // działania // programu size() = 0 1 size() = 6 18 16 14 12 size() = 11 0 1 18 16 14 12 size() = 0 size() = 11 12 14 16 18 1 0 size() = 11 0 12 14 1 16 18 size() = 0 12

Przykład 3. UŜycie stosu (w-12-template-stos.cpp). Metody klasy stack uŝyte w programie: size() zwraca liczbę elementów stosu. push()- dodaje element do stosu. top() zwraca referencje (adres)do elementu znajdującego się na szczycie stosu. #include <stack> template<class T, class C> void ShowStack(stack<T, C>& astack) cout << "astack.size()= " << astack.size() << endl; if (!astack.empty()) cout << "astack.top() = " << astack.top() << endl; int main() // utwórz stos liczb calkowitych stack<int> sint; ShowStack(sInt); // wrzuć elementy na stos for (unsigned int i = 0; i < ; ++i) sint.push(i * 2); ShowStack(sInt); sint.top() = 0; ShowStack(sInt); // pobierz wszystkie elementy ze stosu while (!sint.empty()) cout << sint.top() << endl; sint.pop(); return 0; 13

Przykład 4. UŜycie zbiorów (w-13-template-set.cpp). Metody klasy set uŝyte w programie: size() zwraca liczbę elementów w zbiorze. begin()-zwraca iterator wskazujący na pierwszy element w zbiorze. end()-zwraca iterator wskazujący na ostatni element w zbiorze. insert() wstawia element, zakres elementów do zbioru. #include <set> #include <string> template <class Kontener> void pokazzbior( const Kontener & k ) Kontener :: const_iterator itr; for( itr = k.begin( ); itr!= k.end( ); itr++ ) cout << *itr << '\n'; set<string> s; // uporządkowanie alfabetyczne //set<string, greater<string> > s; // uporządkowanie odwrócone s.insert( "czerowny" ); s.insert( "zielony" ); s.insert( "niebieski" ); pokazzbior( s ); 14