Programowanie obiektowe
Transkrypt
Programowanie obiektowe
Programowanie obiektowe Wykład 6 Piotr Błaszyński Wydział Informatyki Zachodniopomorskiego Uniwersytetu Technologicznego 7 grudnia 2013 Operatory ++ i – Programowanie obiektowe Operatory raz jeszcze Kontenery Iteratory STL Wzorce - klasy szablonowe Standard Template Library Rodzaje wzorców RTTI Real Time Type Information Boost Boost Najprzydatniejsze elementy Pamięć Własne mechanizmy alokacji pamięci operatory przedrostkowe (prefix), ValueHolder& operator++(); operatory przyrostkowe (postfix), ValueHolder operator++(int); konsekwencje dla for( ;;i++) dlaczego warto for( ;;++i) Operatory - kod Programowanie obiektowe Operatory raz jeszcze Kontenery Iteratory STL Wzorce - klasy szablonowe Standard Template Library Rodzaje wzorców class V a l u e H o l d e r { public : V a l u e H o l d e r ( int v a l u e ) : v a l u e ( v a l u e ) {} const int g e t V a l u e ( ) { return v a l u e ; } V a l u e H o l d e r& operator++() ; // prefix V a l u e H o l d e r& operator −−() ; // prefix RTTI Real Time Type Information Boost Boost Najprzydatniejsze elementy Pamięć Własne mechanizmy alokacji pamięci V a l u e H o l d e r operator++(int ) ; // postfix V a l u e H o l d e r operator −−(int ) ; // postfix private : int v a l u e ; }; Operatory - kod Programowanie obiektowe Operatory raz jeszcze Kontenery Iteratory STL Wzorce - klasy szablonowe Standard Template Library V a l u e H o l d e r& V a l u e H o l d e r : : operator++() { ++v a l u e ; return ∗ this ; } Rodzaje wzorców RTTI Real Time Type Information Boost Boost Najprzydatniejsze elementy Pamięć Własne mechanizmy alokacji pamięci V a l u e H o l d e r& V a l u e H o l d e r : : operator −−() { −−v a l u e ; return ∗ this ; } Operatory - kod Programowanie obiektowe Operatory raz jeszcze Kontenery Iteratory STL Wzorce - klasy szablonowe Standard Template Library V a l u e H o l d e r V a l u e H o l d e r : : operator++(int ) { V a l u e H o l d e r r e s u l t ( ∗ this ) ; ++(∗this ) ; return r e s u l t ; } Rodzaje wzorców RTTI Real Time Type Information Boost Boost Najprzydatniejsze elementy Pamięć Własne mechanizmy alokacji pamięci V a l u e H o l d e r V a l u e H o l d e r : : operator −−(int ) { V a l u e H o l d e r r e s u l t ( ∗ this ) ; −−(∗this ) ; return r e s u l t ; } Operatory - kod Programowanie obiektowe Operatory raz jeszcze Kontenery Iteratory STL Wzorce - klasy szablonowe Standard Template Library Rodzaje wzorców RTTI Real Time Type Information Boost Boost Najprzydatniejsze elementy Pamięć Własne mechanizmy alokacji pamięci ValueHolder value (1) ; v a l u e ++; ++v a l u e ; for ( V a l u e H o l d e r i = V a l u e H o l d e r ( 1 ) ; i . g e t V a l u e ( ) <20 ; ++i ) { cout << i . g e t V a l u e ( ) <<e n d l ; } Klasa vector - kod Programowanie obiektowe Operatory raz jeszcze Kontenery Iteratory v e c t o r <double> s t u d e n t m a r k s ; STL Wzorce - klasy szablonowe Standard Template Library for ( int i = 0 ; i <10; i ++) student marks . push back ( i ) ; Rodzaje wzorców RTTI Real Time Type Information Boost Boost Najprzydatniejsze elementy Pamięć Własne mechanizmy alokacji pamięci for ( v e c t o r <double > : : s i z e t y p e i = 0 ; i < s t u d e n t m a r k s . s i z e ( ) ; i ++) cout << s t u d e n t m a r k s [ i ]<< e n d l ; Klasa vector - kod z iteratorem Programowanie obiektowe Operatory raz jeszcze Kontenery Iteratory Iterator - generalizacja pojęcia wskaźnika. v e c t o r <double> s t u d e n t m a r k s ; STL Wzorce - klasy szablonowe Standard Template Library for ( int i = 0 ; i <10; i ++) student marks . push back ( i ) ; Rodzaje wzorców RTTI Real Time Type Information Boost Boost Najprzydatniejsze elementy Pamięć Własne mechanizmy alokacji pamięci for ( v e c t o r <double > : : c o n s t i t e r a t o r student marks . cbegin () ; i t != s t u d e n t m a r k s . cend ( ) ; ++i t ) cout << ( ∗ i t ) <<e n d l ; it = Klasa vector - kod z iteratorem auto Programowanie obiektowe Operatory raz jeszcze Kontenery Iteratory v e c t o r <double> s t u d e n t m a r k s ; STL Wzorce - klasy szablonowe Standard Template Library for ( int i = 0 ; i <10; i ++) student marks . push back ( i ) ; Rodzaje wzorców RTTI Real Time Type Information Boost Boost Najprzydatniejsze elementy Pamięć Własne mechanizmy alokacji pamięci for ( auto i t =s t u d e n t m a r k s . c b e g i n ( ) ; i t != s t u d e n t m a r k s . cend ( ) ; ++i t ) cout << ( ∗ i t ) <<e n d l ; Klasa vector - klasa z iteratorem Programowanie obiektowe Operatory raz jeszcze Kontenery Iteratory STL Wzorce - klasy szablonowe Standard Template Library class V a l u e H o l d e r { public : V a l u e H o l d e r ( int v a l u e ) : v a l u e ( v a l u e ) {} const int g e t V a l u e ( ) { return v a l u e ; } private : int v a l u e ; }; Rodzaje wzorców RTTI Real Time Type Information Boost Boost Najprzydatniejsze elementy Pamięć Własne mechanizmy alokacji pamięci v e c t o r <V a l u e H o l d e r > v a l u e s ; for ( int i = 0 ; i <10; i ++) v a l u es . push back ( ValueHolder ( i ) ) ; for ( v e c t o r <V a l u e H o l d e r > : : c o n s t i t e r a t o r cbegin () ; i t != v a l u e s . cend ( ) ; ++i t ) { ValueHolder holder = ∗ i t ; cout << h o l d e r . g e t V a l u e ( ) <<e n d l ; } i t =v a l u e s . Klasa vector - klasa z iteratorem Programowanie obiektowe Operatory raz jeszcze Kontenery Iteratory STL Wzorce - klasy szablonowe Standard Template Library class V a l u e H o l d e r { public : V a l u e H o l d e r ( int v a l u e ) : v a l u e ( v a l u e ) {} const int g e t V a l u e ( ) { return v a l u e ; } private : int v a l u e ; }; Rodzaje wzorców RTTI Real Time Type Information Boost Boost Najprzydatniejsze elementy Pamięć Własne mechanizmy alokacji pamięci v e c t o r <V a l u e H o l d e r > v a l u e s ; for ( int i = 0 ; i <10; i ++) v a l u es . push back ( ValueHolder ( i ) ) ; for ( auto i t =v a l u e s . c b e g i n ( ) ; i t != v a l u e s . cend ( ) ; ++i t ) { ValueHolder holder = ∗ i t ; cout << h o l d e r . g e t V a l u e ( ) <<e n d l ; } Klasy szablonowe Programowanie obiektowe Operatory raz jeszcze Kontenery Iteratory STL Wzorce - klasy szablonowe Standard Template Library Rodzaje wzorców RTTI Real Time Type Information Boost Boost Najprzydatniejsze elementy Pamięć Własne mechanizmy alokacji pamięci template <class T> class V a l u e H o l d e r { public : V a l u e H o l d e r (T v a l u e ) : v a l u e ( v a l u e ) {} const T g e t V a l u e ( ) { return v a l u e ; } private : T value ; }; v e c t o r <V a l u e H o l d e r <int> > v a l u e s ; for ( int i = 0 ; i <10; i ++) v a l u e s . p u s h b a c k ( V a l u e H o l d e r <int >( i ) ) ; for ( auto i t =v a l u e s . c b e g i n ( ) ; i t != v a l u e s . cend ( ) ; ++i t ) { V a l u e H o l d e r <int> h o l d e r = ∗ i t ; cout << h o l d e r . g e t V a l u e ( ) <<e n d l ; } Standard Template Library - standardowa biblioteka wzorców Programowanie obiektowe Operatory raz jeszcze Kontenery Iteratory STL Wzorce - klasy szablonowe Standard Template Library Rodzaje wzorców RTTI Real Time Type Information Boost Boost Najprzydatniejsze elementy Pamięć Własne mechanizmy alokacji pamięci wzorce, szablony gotowych rozwiązań popularnych problemów programistycznych zawiera: algorytmy, pojemniki na dane (kontenery), iteratory, kilka użytecznych dodatków, wchodzi w skład standardu języka, dostepna w zasadzie na wszystkie platformy. Rodzaje wzorców - kontenery Programowanie obiektowe Operatory raz jeszcze Kontenery Iteratory STL Wzorce - klasy szablonowe Standard Template Library Rodzaje wzorców RTTI Real Time Type Information Boost Boost Najprzydatniejsze elementy Pamięć Własne mechanizmy alokacji pamięci vector, list, deque, set, multiset, map, multimap, hash set, hash multiset, hash map, hash multimap, w nowym standardzie C++11: array, forward list, unordered set, unordered multiset, unordered map, unordered multimap, szablony, które można traktowac jako kontenery: bitset, valarray, Rodzaje wzorców - algorytmy Programowanie obiektowe Operatory raz jeszcze Kontenery Iteratory STL Wzorce - klasy szablonowe Standard Template Library Rodzaje wzorców RTTI Real Time Type Information Boost Boost Najprzydatniejsze elementy Pamięć Własne mechanizmy alokacji pamięci do wyszukiwania i przeglądania (Non-mutating): for each, find, find if, adjacent find, find first of, count, count if, mismatch, equal, search, search n, find end, do wykonywania zmian (Mutating): copy, copy n, copy backward, transform, fill, fill n, generate, generate n, unique, unique copy, reverse, reverse copy, rotate, rotate copy, random shuffle, random sample, random sample n, partition, stable partition Swap: swap, iter swap, swap ranges, Replace: replace, replace if, replace copy, replace copy if, Remove: remove, remove if, remove copy, remove copy if , Rodzaje wzorców - algorytmy cd. Programowanie obiektowe Operatory raz jeszcze Kontenery Iteratory STL Wzorce - klasy szablonowe Standard Template Library Rodzaje wzorców RTTI Real Time Type Information Boost Boost Najprzydatniejsze elementy Pamięć Własne mechanizmy alokacji pamięci sortowanie podstawowe: sort, stable sort, partial sort, partial sort copy, is sorted, nth element wyszukiwanie binarne: lower bound, upper bound, equal range, binary search, łączenie i operacje na zbiorach: merge, inplace merge, includes, set union, set intersection, set difference, set symmetric difference, operacje na stercie: push heap, pop heap, make heap, sort heap, is heap, wartości min, max: min, max, min element, max element, inne: lexicographical compare, lexicographical compare 3way, next permutation, prev permutation, Uogólnione liczbowe: iota, accumulate, inner product, partial sum, adjacent difference, power. Rodzaje wzorców - inne Programowanie obiektowe Operatory raz jeszcze Kontenery Iteratory STL Wzorce - klasy szablonowe Standard Template Library Rodzaje wzorców RTTI Real Time Type Information Boost Boost Najprzydatniejsze elementy Pamięć Własne mechanizmy alokacji pamięci iteratory koncepcja powiązana, ale nie zawsze (istream iterator, ostream iterator) z kontenerami, iterator const iterator dodatki koncept Assignable (obiekty z możliwością przypisywania), nisko poziomowe zarzadzanie pamięcią: Allocators, funktory - uogólnienie funkcji - wszystko co można wywołać jak funkcje, przydatne np. jako parametry algorytmów. ”I can do better in one evening”. I know. I understand. I have been there. Programowanie obiektowe Operatory raz jeszcze Kontenery Iteratory v e c t o r <int> V( 1 0 ) ; i o t a (V . b e g i n ( ) , V . end ( ) , 7 ) ; copy (V . b e g i n ( ) , V . end ( ) , o s t r e a m i t e r a t o r <int >( cout , " element \n" ) ) ; STL Wzorce - klasy szablonowe Standard Template Library Rodzaje wzorców RTTI Real Time Type Information Boost Boost Najprzydatniejsze elementy Pamięć Własne mechanizmy alokacji pamięci 7 element 8 element 9 element 10 e l e m e n t 11 e l e m e n t 12 e l e m e n t 13 e l e m e n t 14 e l e m e n t 15 e l e m e n t 16 e l e m e n t Kontenery - używanie pasujących do problemu Programowanie obiektowe Operatory raz jeszcze Kontenery Iteratory STL tabelka efektywności struktur kontenerowych http://www.tantalon.com/pete/cppopt/appendix.htm Wzorce - klasy szablonowe Standard Template Library Rodzaje wzorców RTTI Real Time Type Information Boost Boost Najprzydatniejsze elementy Pamięć Własne mechanizmy alokacji pamięci http://www.cs.northwestern.edu/ riesbeck/programming/c++ summary.html http://stackoverflow.com/questions/181693/what-arethe-complexity-guarantees-of-the-standard-containers Kontenery - używanie pasujących do problemu Programowanie obiektowe Operatory raz jeszcze Kontenery Iteratory STL Wzorce - klasy szablonowe Standard Template Library Rodzaje wzorców RTTI Real Time Type Information Boost Boost Najprzydatniejsze elementy Pamięć Własne mechanizmy alokacji pamięci funkcja pamięć wstępna alokacja narzut na informacje o sąsiadach może w każdej chwili zaalokowac całość wstawianie elementów na końcu wstawianie elementów gdziekolwiek dostęp do elementów vector ciągła tak list nie nie nie tak tak nie, bo dodajemy zawsze jeden element stały czas stały czas N/2 stały czas swobodny ”trudny” Rzutowanie Programowanie obiektowe Operatory raz jeszcze Kontenery Iteratory STL Wzorce - klasy szablonowe Standard Template Library Rodzaje wzorców RTTI Real Time Type Information Boost Boost Najprzydatniejsze elementy Pamięć Własne mechanizmy alokacji pamięci (typ) static cast<typ> dynamic cast<typ> const cast<typ> reinterpet cast<typ> Real Time Type Information Programowanie obiektowe Operatory raz jeszcze Kontenery Iteratory STL Wzorce - klasy szablonowe Standard Template Library Rodzaje wzorców RTTI Real Time Type Information Boost Boost Najprzydatniejsze elementy Pamięć Własne mechanizmy alokacji pamięci Informacje o typach w trakcie wykonywania programu, typeid(obiekt) Boost Programowanie obiektowe Operatory raz jeszcze Kontenery Iteratory STL Wzorce - klasy szablonowe Standard Template Library Rodzaje wzorców RTTI Real Time Type Information Boost Boost Najprzydatniejsze elementy Pamięć Własne mechanizmy alokacji pamięci przydatne konstrukcje językowe w bibliotece dostepnej za darmo, algorytmy, struktury danych, kontenery, wymagana instalacja i w miarę nowy kompilator. Najprzydatniejsze elementy Programowanie obiektowe Operatory raz jeszcze Kontenery BOOST FOREACH Iteratory STL Wzorce - klasy szablonowe Standard Template Library Rodzaje wzorców RTTI Real Time Type Information Boost Boost Najprzydatniejsze elementy Pamięć Własne mechanizmy alokacji pamięci wielowątkowość (boost::thread), funkcje matematyczne, parsowanie tekstu (boost::spirit), asynchroniczne IO (boost::asio), system plików (boost::filesystem::path i całe boost::filesystem) Programowanie obiektowe Operatory raz jeszcze #i n c l u d e <b o o s t / f o r e a c h . hpp> Kontenery v e c t o r <V a l u e H o l d e r <int> > v a l u e s ; for ( int i = 0 ; i <10; i ++) v a l u e s . p u s h b a c k ( V a l u e H o l d e r <int >( i ) ) ; for ( auto i t =v a l u e s . c b e g i n ( ) ; i t != v a l u e s . cend ( ) ; ++i t ) { V a l u e H o l d e r <int> h o l d e r = ∗ i t ; } BOOST FOREACH( V a l u e H o l d e r <int> v h o l d e r , v a l u e s ) { cout << v h o l d e r . g e t V a l u e ( ) <<e n d l ; } Iteratory STL Wzorce - klasy szablonowe Standard Template Library Rodzaje wzorców RTTI Real Time Type Information Boost Boost Najprzydatniejsze elementy Pamięć Własne mechanizmy alokacji pamięci Własne mechanizmy alokacji pamięci Programowanie obiektowe Operatory raz jeszcze Kontenery Iteratory Własny alokator domyslny alokator: STL Wzorce - klasy szablonowe v e c t o r <double> V( 1 0 0 , 5 . 0 ) ; Standard Template Library Rodzaje wzorców RTTI Real Time Type Information Boost Boost Najprzydatniejsze elementy Pamięć Własne mechanizmy alokacji pamięci dla powyzszego wektora używamy alokator szybszy (być może), ale tylko do aplikacji jednowątkowej: v e c t o r <double , s i n g l e c l i e n t a l l o c > l o c a l (V . b e g i n ( ) , V . end ( ) ) ;