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



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

Programowanie i struktury danych

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

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

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

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

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

Kurs programowania. Wykład 9. Wojciech Macyna

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

Algorytmy i Struktury Danych.

STL: Lekcja 1&2. Filozofia STL

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

Szablony funkcji i szablony klas

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.

Zaawansowane programowanie w języku C++ Biblioteka standardowa

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

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

Język C++ wykład VIII

C++ - szablony kontenerów. Kontenery i szablony kontenerów. C++ - szablony kontenerów. C++ - szablony kontenerów. C++ - szablony kontenerów

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

STL Standardt Template Library (wprowadzenie)

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

Paradygmaty programowania. Paradygmaty programowania

Abstrakcyjny typ danych

Operatory na rzecz typu TString

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

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

Jak Windows zarządza pamięcią?

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

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

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

Programowanie obiektowe C++

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

Wstęp do Programowania 2

dr inż. Jarosław Forenc

Wprowadzenie do szablonów klas

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

C++ - szablony kontenerów. Kontenery i szablony kontenerów. C++ - szablony kontenerów. C++ - szablony kontenerów. C++ - szablony kontenerów

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

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

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

Algorytmy i Struktury Danych. Anna Paszyńska

Szablony funkcji i klas (templates)

Wstęp do Programowania 2

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

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

Projektowanie klas c.d. Projektowanie klas przykład

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

Programowanie obiektowe w C++ Wykład 12

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

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

Modelowanie numeryczne w fizyce atmosfery Ćwiczenia 3

Technologie cyfrowe semestr letni 2018/2019

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

Wstęp do programowania

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

Programowanie Komponentowe Zarządzanie obiektami: kontenery

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

PARADYGMATY PROGRAMOWANIA Wykład 4

Zaawansowane programowanie w C++ (PCP)

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

Biblioteka standardowa C++

Kontenery i iteratory. Wykorzystanie kontenerów w praktyce.

Wstęp do wiadomości teoretycznych (nie, nie jest to masło maślane ani wstęp, wstępów proszę cierpliwie czytać)

Wzorce funkcji (szablony)

Programowanie obiektowe w C++ Wykład 11

DYNAMICZNE PRZYDZIELANIE PAMIECI

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

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

Szablon klasy std::vector

Laboratorium 1. Programowanie II - Kierunek Informatyka. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej

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

PARADYGMATY PROGRAMOWANIA Wykład 3

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

Krótkie wprowadzenie do STL. XIV LO im. S. Staszica, K06 D

PARADYGMATY PROGRAMOWANIA Wykład 2

Programowanie Komputerów

Efekty uboczne błędów

Programowanie w C++ z użyciem kontenerów - parę przykładów programów Opracowanie: dr hab. Mirosław R. Dudek, prof. UZ

Wyjątki (exceptions)

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

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

Programowanie w języku C++

Paradygmaty programowania

Stos liczb całkowitych

Zaawansowane programowanie w C++ (PCP)

Podstawy Programowania

Wprowadzenie do szablonów szablony funkcji

Algorytmy w C++ dla opornych!

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

Programowanie komputerowe. Zajęcia 5

Ćwiczenia IV - Kontenery (pojemniki)

Szablon klasy std::list

Kiedy potrzebne. Struktura (rekord) Struktura w języku C# Tablice struktur. struktura, kolekcja

Wprowadzenie do szablonów szablony funkcji

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

Programowanie obiektowe i C++ dla matematyków

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

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

Transkrypt:

Język C++ część 9 szablony klas Jarosław Gramacki Instytut Informatyki i Elektroniki szablony funkcji były omawiane na wcześniejszym wykładzie nazewnictwo: szablon funkcji <-> wzorzec funkcji 2

szablony klas szablony klas umożliwiają definiowanie ogólnej klasy czyli mogącej przetwarzać dane różnego typu (tzw. parametryzacja typów) użyteczność takich klas jest szczególnie widoczna przy implementacji tzw. kontenerów. Intensywnie używa ich biblioteka STL obecnie pokazane zostaną zasady tworzenia klas szablonowych przykład: zmodyfikujemy wielokrotnie używaną wcześniej klasę Stack, aby możliwe było obsługiwanie stosów nie tylko elementów całkowitych int szablony klas a dziedziczenie szablony klas to inne podejście do idei tzw. powtórnego użycia kodu (ang. code reuse). Zamiast dziedziczenia (powtórne użycie kodu obiektowego), wzorce powtórnie używają kodu źródłowego 3 szablony klas wersja pierwotna klasy Stack #include <iostream.h> enum stack_state OK, FULL, EMPTY; class StackNew StackNew( int _size = 10 ); ~StackNew() delete [] table; void push( int ); int pop(); void print(); int ile_elementow(); int get_size() return size; private: int size; int* table; int top; stack_state state; ; StackNew::StackNew( int _size ) size = _size; table = new int[ size ]; top = 0; state = EMPTY; cdn. 4

szablony klas void StackNew::push( int _element )... int StackNew::pop()... void StackNew::print()... inline int StackNew::ile_elementow()... cdn. 5 szablony klas void main() StackNew s1( 5 ); s1.push( 5 ); s1.push( 10 ); s1.push( 15 ); cout << "Liczba elementow = " << s1.ile_elementow() << endl; s1.print(); cout << "Pop 1 = " << s1.pop() << endl; cout << "Pop 2 = " << s1.pop() << endl; cout << "Pop 3 = " << s1.pop() << endl; cout << "Liczba elementow = " << s1.ile_elementow() << endl; cout << "Pop 4 = " << s1.pop() << endl; for(int i = 0; i < s1.get_size()+1; i++ ) cout << "Push : " << i << endl; s1.push( i ); s1.print(); cout << "Liczba elementow = "<< s1.ile_elementow() << endl; 6

szablony klas klasa i obiekty bool wersja szablonowa klasy StackNew (wprowadzono niewielkie zmiany w stosunku do oryginału) składnia jest bardzo podobna do tej używanej w szablonach funkcji enum stack_state OK, FULL, EMPTY; template<class T> class StackNew StackNew( int _size = 10 ); ~StackNew() delete [] table; bool push( T ); bool pop( T& ); void print(); int ile_elementow(); int get_size() return size; private: int size; T* table; int top; stack_state state; ; obiekty klasy szablonowej StackNew<int> s1( 5 ); StackNew<long> s2( 7.4 ); StackNew<double> s3( 15.6 ); uwaga dotycząca nazewnictwa: StackNew to kontener do przechowywania danych różnych typów Ogólny typ T (nazwa T oczywiście dowolna) puch, pop: inaczej niż w wersji "non-template" // Przyjęło się formatować raczej tak: template<class T> class StackNew... // wymamiaj "StosNew typu int" // od nowej linii 7 szablony klas metody składowe klasy szablonowej składnia jest dosyć skomplikowana ale logiczna template<class T> StackNew<T>::StackNew( int _size ) size = _size; table = new T[ size ]; typ wbudowany top = 0; state = EMPTY; oczywiście można je mieszać ze sobą template<class T> bool StackNew<T>::push( T _element ) if( state!= FULL ) table[ top++ ] = _element; return true; typ sparametryzowany else cout << "*** Pelny stos! ***" << endl; if( top >= size ) state = FULL; return false; else state = OK; return true; template<class T> bool StackNew<T>::pop( T& _element) if( state!= EMPTY ) _element = table[ --top ]; return true; else cout << "*** Pusty stos! ***" << endl; if( top <= 0 ) state = EMPTY; return false; else state = OK. return true ; template<class T> void StackNew<T>::print() for( int i = top-1; i >= 0; i-- ) cout << "[ " << table[ i ] << " ]" << endl; template<class T> int StackNew<T>::ile_elementow() return top; 8

szablony klas konkretyzacja klasy szablonowej test stosu dla różnych typów danych. konkretyzacja klasy StackNew<T> void main() StackNew<int> s1( 5 ); // ---------- Stos danych typu int. s1.push( 5 ); s1.push( 10 ); cout << "Liczba elementow = " << s1.ile_elementow() << endl; s1.print(); cout << "Pop 1 = " << s1.pop() << endl; cout << "Pop 2 = " << s1.pop() << endl; cout << "Liczba elementow = " << s1.ile_elementow() << endl; cout << "Pop 3 = " << s1.pop() << endl; StackNew<long> s2( 5 ); // ---------- Stos danych typu long. s2.push( 50000L ); s2.push( 1000000L ); cout << "Liczba elementow = " << s2.ile_elementow() << endl; s2.print(); cout << "Pop 1 = " << s2.pop() << endl; cout << "Pop 2 = " << s2.pop() << endl; cout << "Liczba elementow = " << s2.ile_elementow() << endl; cout << "Pop 3 = " << s2.pop() << endl; 9 szablony klas konkretyzacja klasy szablonowej klasę szablonową można konkretyzować za pomocą innej klasy (tam gdzie ma to sens ze względu na operacje na danych obiektach) podobnie postępowaliśmy z szablonami funkcji void main() StackNew<Zespolona> s1( 5 ); // ---------- Stos danych typu Zespolona. s1.push( Zespolona( 5, -1 ) ); s1.push( Zespolona( 10, -2 ) ); klasę Zespolona pokazano na wcześniejszych wykładach cout << "Liczba elementow = " << s1.ile_elementow() << endl; s1.print(); cout << "Pop 1 = " << s1.pop() << endl; cout << "Pop 2 = " << s1.pop() << endl; cout << "Liczba elementow = " << s1.ile_elementow() << endl; cout << "Pop 3 = " << s1.pop() << endl; StackNew<String> s2( 5 ); // ---------- Stos danych typu String. s2.push( "Pierwszy test" ); s2.push( "Drugi test" ); klasę String pokazano na wcześniejszych wykładach cout << "Liczba elementow = " << s2.ile_elementow() << endl; s2.print(); cout << "Pop 1 = " << s2.pop() << endl; cout << "Pop 2 = " << s2.pop() << endl; cout << "Liczba elementow = " << s2.ile_elementow() << endl; cout << "Pop 3 = " << s2.pop() << endl; 10

szablony klas zastosowanie szablonów funkcji na dwóch poprzednich stronach kody testujące różne stosy były bardzo podobne podobieństwo to "obsłużymy" szablonem funkcji (znamy już je z poprz. wykładów) wzorzec funkcji... funkcja testująca template< class T > void teststack( StackNew< T > &thestack, // reference to Stack< T > T value, // initial value to push T increment, // increment for subsequent values const char *stackname ) // name of the Stack < T > object cout << "\npushing elements onto " << stackname << '\n'; while ( thestack.push( value ) ) cout << value << ' '; value += increment; cout << "\nstack is full. Cannot push " << value << "\n\npopping elements from " << stackname << '\n'; while ( thestack.pop( value ) ) cout << value << ' '; dlatego push zwraca bool cout << "\nstack is empty. Cannot pop\n"; c.d.n. 11 szablony klas zastosowanie szablonów funkcji i używamy szablonu funkcji testującej różne stosy int main() StackNew< double > doublestack( 5 ); // obiekt #1 StackNew< int > intstack; // obiekt #2 teststack( doublestack, 1.0, 0.5, "doublestack" ); teststack( intstack, 1, 3, "intstack" ); return 0; 12

szablony klas uwagi dotyczące notacji wersja inline #include <iostream> using namespace std; template<class T> class Array private: enum size = 100 ; T A[size]; T& operator[](int index) if (index >= 0 && index < size) return A[index]; ; // nasza "inteligentna" tablica // wersja inline operator[] int main() Array<int> ia; Array<float> fa; for(int i = 0; i < 20; i++) ia[i] = i * i; fa[i] = float(i) * 1.414; for(int j = 0; j < 20; j++) cout << j << ": " << ia[j] << ", " << fa[j] << endl; 13 szablony klas uwagi dotyczące notacji wersja inline nie zawsze będzie odpowiednia, więc #include <iostream> using namespace std; template<class T>class Array private: enum size = 100 ; T A[size]; T& operator[](int index); ; template<class T> T& Array<T>::operator[](int index) if (index >= 0 && index < size) return A[index]; porównaj z poprzednią wersją formatowanie ułatwiające czytanie // wersja non-inline operator[] int main() Array<float> fa; fa[0] = 1.414; 14

szablony klas iteratory o iteratorach często mówi się jako o tzw. "bystrych wskaźnikach" (ang. smart pointers). Trudno przy ich użyciu na przykład "wyjść poza obiekt" iterator to (prawie) zwykły obiekt, który "przesuwa się" wzdłuż danego kontenera obiektów wybierając jeden z nich. Co ważne, dostęp do implementacji danego kontenera nie jest wymagany (gdyż będziemy używali klas zaprzyjaźnionych) terminologia obiektowa: iterator to obiekt do przemieszczania się po kontenerze obiektów 15 szablony klas iteratory najprostszy przykład iteratora. Zmiany w deklaracji klasy (na razie nie-szablonowej) #include <iostream.h> enum stack_state OK, FULL, EMPTY; class StackNew StackNew( int _size = 10 ); ~StackNew() delete [] table; void push( int ); int pop(); void print(); int ile_elementow(); int get_size() return size; friend class StackNewIter; private: int size; int* table; int top; stack_state state; ; StackNewIter, zaprojektowano aby działało tylko ze StackNew klasa zaprzyjaźniona z klasą StackNew. To dodajemy. 16

szablony klas iteratory najprostszy przykład iteratora implementacja StackNewIter. Ograniczamy się jedynie do "iterowania" w przód (przeciążamy tylko operator ++) class StackNewIter StackNew& s; int index; StackNewIter ( StackNew& is ) : s(is), index(0) // konstruktor int operator++() // Prefix if (index < s.top) cout << "iterator moved out of range"; else return s.table[ ++index ]; int operator++( int ) // Postfix if (index < s.top) cout << "iterator moved out of range"; else return s.table[ index++ ]; ; 17 szablony klas iteratory Testowanie iteratora int main() StackNew MyStack; for(int i = 0; i < 20; i++) MyStack.push( i ); StackNewIter iter( MyStack ); for(int j = 0; j < 20; j++) cout << iter++ << endl; // stos (kontener) // iterator (obiekt) iter // kontenera MyStack // przekazanego jako parametr przeciążanie operatora 1-argumentowego. Patrz poprzedni wykład 18

szablony klas iteratory Załóżmy, że dla każdego kontenera jaki utworzymy chcemy dodać iterator. Najwygodniej, aby każdy deklarowany w programie iterator był po prostu klasy iterator. Jak wyeliminować jednak konflikty nazw, które się pojawią? Użyjemy zagłębionej klasy (ang. nested class). Tak też robi się w bibliotece STL Uwaga! Dalszy materiał jest trudny! class StackNew StackNew( int _size = 10 ); ~StackNew() delete [] table; void push( int ); int pop(); void print(); int ile_elementow(); int get_size() return size; class iterator; friend class iterator; When making a nested friend class, you must go through the process of first declaring the name of the class, then declaring it as a friend, then defining the class. Otherwise, the compiler will get confused. używamy mechanizmu zagłębiania w sobie klas // nested friend class class iterator // kod iteratora (patrz następna strona) ; iterator begin() return iterator(*this); iterator end() return iterator(*this, true); // Create the "end sentinel": private: int size; int* table; int top; stack_state state; ; patrz następna strona 19 szablony klas iteratory implementacja "zagłębionego" iteratora. Dodano kilka nowych elementów private: // kod iteratora StackNew& s; int index; iterator ( StackNew& is ) : s(is), index(0) // jak poprzednio // To create the "end sentinel" iterator: iterator ( StackNew& is, bool) : s(is), index(s.top) // konstruktor #2 int current() const return s.table[ index ]; int operator++() // Prefix if (index < s.top) cout << "iterator moved out of range"; else return s.table[ ++index ]; int operator++(int) // Postfix if (index < s.top) cout << "iterator moved out of range"; else return s.table[ index++ ]; iterator& operator+= ( int amount ) // iterator forward if ( index + amount < s.top ) cout << "StackNew::iterator::operator+=()"; cout << "tried to move out of bounds"; else index += amount; return *this; bool operator==(const iterator& r) const // To see if you're at the end: return index == r.index; bool operator!=(const iterator& r) const return index!= r.index; 2 kwalifikatory gdyż "nested class"! friend ostream& operator<<(ostream& os, const iterator& it) return os << it.current(); 20

szablony klas iteratory Testowanie "zagłębionego" iteratora int main() StackNew MyStack; for(int i = 0; i < 20; i++) MyStack.push( i ); 2 kwalifikatory gdyż "nested class"! cout << "Traverse the whole StackNew\n"; StackNew::iterator iter = MyStack.begin(); while(iter!= MyStack.end()) cout << iter++ << endl; cout << "Traverse a portion of the StackNew\n"; StackNew::iterator start = MyStack.begin() StackNew::iterator end = MyStack.begin(); dwa iteratory (obiekty). Oba ustawione na starcie na początku kontenera start += 5, end += 15; cout << "start = " << start << endl; cout << "end = " << end << endl; while(start!= end) cout << start++ << endl; 21 szablony klas iteratory komentarz do przykładu z poprzedniej strony: Funkcja current( ) zwraca aktualny element, na który "wskazuje" iterator Dzięki operatorowi += można "iteraować" co wybraną liczbę elementów Operatory == oraz!= porównują dwa iteratory (obiekty klasy StackNew::iterator). W praktyce służą one do testowania osiągnięcia końca kontenera. Porównaj deklaracje iteratorów start i end (często nazywanego w literaturze "end sentinel"). Iteratory start i end tworzone są z użyciem funkcji begin() i end() begin() korzysta z pierwszej wersji konstruktora klasy iterator (w którym pole index ustawiane jest na 0) end() korzysta z drugiej wersji konstruktora klasy iterator. (w którym pole index ustawiane jest na wartość top). Drugi parametr tego konstruktora (bool) to więc tylko atrap, służąc odróżnieniu od siebie obu konstruktorów. 22

szablony klas iteratory Kolejna modyfikacja mogła by polegać na napisaniu analogicznych wersji iteratorów ale zagłębionych w klasie szablonowej (gdyż omawiane na kilku poprzednich stronach zagadnienia ilustrowaliśmy na stosie int-ów) pomijamy jednak to zagadnienie 23 szablony klas kontenery (standardowe) Kontenery (pojemniki) są to klasy sparametryzowane (szablony) służące do przechowywania i udostępniania danych. Kontenery standardowe zdefiniowano w normie ANSI 1998: poniżej tylko ogólne spojrzenie na kontenery standardowe (ANSI 1998): vector vector<bool> list stack queue deque priority queue set multiset bitset map multimap string - tablica rozszerzalna, dostęp do elementów przez indeks. - specjalna wersja kontenera, operująca na bitach pamięci. - lista elementów; efektywne wstawianie i usuwanie. - stos; dostęp tylko do wierzchołka stosu - kolejka; wstawianie na końcu, usuwanie z początku. - kolejka dwustronna; wstawianie/usuwanie z obu końców. - kolejka do operacji na dużych elementach. - brak kolejności; operacje zawierania, dołączania i usuwania. - j.w. z powtarzającymi się elementami. - jak set; zoptymalizowany sposób przechowywania wartości binarnych - dostęp do wartości poprzez unikatowy klucz - j.w. ale klucz może się powtarzać. - przechowywanie i operacje na łańcuchu. 24

szablony klas algorytmy (standardowe) Algorytmy są sparametryzowanymi funkcjami realizującymi typowe operacje na kontenerach Dostępne są przez plik nagłówkowy <algorithm>. Przykłady z biblioteki standardowej: find() - znajduje element odpowiadający argumentowi find_if() - znajduje element spełniający podany warunek max_element() - znajduje wartość maksymalną w podanym zakresie min_element() - znajduje wartość minimalną w podanym zakresie reverse() - odwraca kolejność elementów replace() - zastępuje podane wartości nową wartością next_permutation() - generuje permutację elementów random_shuffle() - miesza (tasuje) elementy count() - zlicza elementy odpowiadające podanej wartości for_each() - stosuje podaną funkcję do każdego elementu. 25 szablony klas kontener vector Klasa jest dostępna poprzez plik nagłówkowy <vector>. Przykłady konkretyzacji klasy: vector<double> x; vector<int> a(10, 0); // pusta tablica // tab. 10-el. wypełniona zerami size Wybrane metody klasy vector: - zwraca liczbę elementów w wektorze insert - wstawia nowy element przed podaną pozycję push_back - wstawia nowy element na koniec tablicy erase clear - usuwa element z podanej pozycji - usuwa wszystkie elementy z wektora. Do wektora można zastosować też funkcje realizujące różnego typu algorytmy (sortowanie, odwracanie kolejności, permutacje itp..) 26

lista (zagadnień) nieobecnych Na omówienie tych zagadnień nie starczyło już czasu :-( biblioteka STL. Została jedynie zasygnalizowana + podano bardzo elementarne przykłady http://www.sgi.com/tech/stl/ (Standard Template Library Programmer's Guide) http://www.msoe.edu/eecs/cese/resources/stl/ http://pegasus.rutgers.edu/~elflord/cpp/stdlib/ http://yolinux.com/tutorials/linuxtutorialc++stl.html strumienie wej/wyj, przetwarzanie plików (w przykładach używaliśmy jedynie naprawdę podstawowych elementów związanych z wej / wyj i plikami) obsługa wyjątków (słowa kluczowe try, throw, catch niespodziewane wyjątki hierarchia wyjatków) preprocesor klasa string i przetwarzanie napisów 27