C++ wykład 12 (11.05.2016) Kolekcje standardowe.

Slides:



Advertisements
Podobne prezentacje
C++ wykład 9 ( ) Szablony.
Advertisements

C++ wykład 13,14,15 (16/23/ ) STL.
Standardowa biblioteka języka C++
Standard Template Library
Standard Template Library
Kurs języka C++ – wykład 13 ( )
Programowanie w języku C++
K URS JĘZYKA C++ – WYKŁAD 10 ( ) Szablony.
Mapa STL – C++. Problem polega na tym, że najczęściej chcielibyśmy przechowywać w zbiorze elementy jakiegoś bardziej złożonego typu, których on nie będzie.
STOS. STL (ang. Standard Template Library) jest to biblioteka zawierająca algorytmy, pojemniki, iteratory oraz inne konstrukcje w formie szablonów, gotowe.
© Kazimierz Duzinkiewicz, dr hab. inż. Katedra Inżynierii Systemów Sterowania 1 Metody optymalizacji - Energetyka 2015/2016 Metody programowania liniowego.
Ryzyko a stopa zwrotu. Standardowe narzędzia inwestowania Analiza fundamentalna – ocena kondycji i perspektyw rozwoju podmiotu emitującego papiery wartościowe.
Wprowadzenie do języka Java Kolekcje w języku Java Bartosz Walter.
Wypadkowa sił.. Bardzo często się zdarza, że na ciało działa kilka sił. Okazuje się, że można działanie tych sił zastąpić jedną, o odpowiedniej wartości.
Porównywarki cen leków w Polsce i na świecie. Porównywarki w Polsce.
Standardy de facto zapisu georeferencji map o postaci rastrowej definicja georeferencji standard „World File” standard GeoTIFF.
Menu Jednomiany Wyrażenia algebraiczne -definicja Mnożenie i dzielenie sum algebraicznych przez jednomian Mnożenie sum algebraicznych Wzory skróconego.
Python. Języki Programistyczne Microcode Machine code Assembly Language (symboliczna reprezentacja machine code) Low-level Programming Language (FORTRAN,
ORGANIZACJA LOGICZNA PLIKÓW. Wprowadzenie (1) Organizacja pliku określa sposób uporządkowania rekordów w pliku przechowywanym na dysku Różne sposoby organizacji.
Optymalna wielkość produkcji przedsiębiorstwa działającego w doskonałej konkurencji (analiza krótkookresowa) Przypomnijmy założenia modelu doskonałej.
Metody sztucznej inteligencji - Technologie rozmyte i neuronowe 2015/2016 Perceptrony proste nieliniowe i wielowarstwowe © Kazimierz Duzinkiewicz, dr hab.
Definiowanie i planowanie zadań typu P 1.  Planowanie zadań typu P  Zadania typu P to zadania unikalne służące zwykle dokonaniu jednorazowej, konkretnej.
Jak tworzymy katalog alfabetyczny? Oprac.Regina Lewańska.
Moduł SDI – zasilanie węzłów IIP oraz wykorzystanie danych. Wprowadzenie. Szkolenie przeprowadzone w ramach projektu „TERYT 3 – Rozbudowa systemów do prowadzenia.
API jądra do obsługi przestrzeni użytkownika Co jest tematem tej prezentacji: Transport danych pomiędzy przestrzeniami użytkownika i jądra (asm/uaccess.h)
Budżetowanie kapitałowe cz. III. NIEPEWNOŚĆ senesu lago NIEPEWNOŚĆ NIEMIERZALNA senesu strice RYZYKO (niepewność mierzalna)
Moduł II. Obszar formułowania Programów i Projektów.
Język Java Paweł Rajba
Dziedziczenie, polimorfizm, Interfejsy
BVMS 5.5 Blok2- Moduł 8: Użytkownicy i grupy
PODSTAWY TEORII BAZ DANYCH
Test analizy wariancji dla wielu średnich – klasyfikacja pojedyncza
Programowanie Obiektowe – Wykład 1
Zasady transmisji w sieciach TCP/IP
Schematy blokowe.
Kurs języka C++ – wykład 2 ( )
DEFINICJA I ZASTOSOWANIE W JĘZYKU HASKELL
On-the-Fly Garbage Collection
Akademia C# - Lab2 Zmienne, instrukcje warunkowe, pętle, debugger,
Kurs języka C++ – wykład 6 ( )
Rekursje Tak jak w innych językach funkcje mogą odwoływać się same do siebie Możemy regulować głębokość przed stwierdzeniem błędu (MaxRecursion, $RecursionLimit,
ALGORYTMY I STRUKTURY DANYCH
Akademia C# lab. 9 Zdarzenia i delegaty.
Programowanie obiektowe Wykład 10
Programowanie obiektowe
Budowa, typologia, funkcjonalność
Wstęp do Informatyki - Wykład 8
Programowanie obiektowe
Kurs języka C++ – wykład 13 ( )
PROGRAMY DO KONTROLI RODZICIELSKIEJ
Bezpieczeństwo dostępu do danych w systemie Windows
Języki programowania.
PRZYKŁADY Metody obrazowania obiektów
Tensor naprężeń Cauchyego
Instrukcje wyboru.
Podstawy informatyki Zygfryd Głowacz.
ALGORYTMY I STRUKTURY DANYCH
Strukturalne wzorce projektowe
Porównywanie średnich prób o rozkładach normalnych (testy t-studenta)
ALGORYTMY I STRUKTURY DANYCH
MATEMATYKAAKYTAMETAM
Zmienne i typy danych w C#
PGO Kolekcje Michail Mokkas.
Implementacja rekurencji w języku Haskell
POZNAJEMY PULPIT Opracowanie: mgr Barbara Benisz SP nr 20 w Rybniku
Bufory.
Język C++ Preprocesor Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła.
Język C++ Operatory Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła.
Autor: Magdalena Linowiecka
Zapis prezentacji:

C++ wykład 12 (11.05.2016) Kolekcje standardowe

Spis treści Ogólnie o STL Pary i tuple Sprytne wskaźniki Ograniczenia liczbowe Minimum i maksimum Zamiana wartości Operatory porównywania Kontenery i ich zawartość Kontenery sekwencyjne Kontenery uporządkowane Kontenery nieuporządkowane Adaptatory kontenerów Iteratory

STL STL (ang. Standard Template Library) to standardowa biblioteka wzorców w C++. Wszystkie składniki STL są wzorcami. STL jest rdzeniem biblioteki standardowej C++. Wszystkie identyfikatory w bibliotece standardowej C++ zdefiniowane są w przestrzeni nazw std. Zaleta STL – mnóstwo gotowych szablonów klas pozwalających programować na wyższym poziomie abstrakcji. Wada STL – brak oczywistości (koniecznie czytaj dokumentację)

STL Biblioteka STL składa się z kilku modułów: strumienie we/wy, kontenery i iteratory, algorytmy i obiekty funkcyjne, łańcuchy i wyrażenia regularne, wielowątkowość i przetwarzanie współbieżne, internacjonalizacja, klasy narzędziowe.

Pary Szablon struktury pair<> (zdefiniowany w <utility>) umożliwia potraktowanie dwóch wartości jako pojedynczego elementu. Para posiada dwa pola: first i second. Para posiada konstruktor dwuargumentowy oraz domyślny i kopiujący. Pary można porównywać (operatory == i <). Istnieje szablon funkcji make_pair() do tworzenia pary (typy danych są rozpoznawane przez kompilator po typach argumentów). Przykłady: void f (std::pair<int, const char *>); void g (std::pair<const int, std::string>); … std::pair<int, const char*> p(44, ”witaj”); f(p); // wywołuje domyślny konstruktor kopiujący g(p); // wywołuje konstruktor wzorcowy g(std::make_pair(44,”witaj”)); // przekazuje dwie // wartości jako parę z wykorzystaniem konwersji // typów Pary są wykorzystywane w kontenerach map i multimap.

Tuple W C++11 zdefiniowano tuple do przechowywania wielu wartości a nie tylko dwóch (szablon tuple<> jest analogią do szblonu pary pair<>). Tupla posiada wiele ponumerowanych pól, do których dostęp mamy za pomocą metody get<i>. Tupla posiada konstruktor wieloargumentowy oraz domyślny i kopiujący. Tuple można porównywać za pomocą operatorów porównań (porównywanie leksykograficzne). Istnieje szablon funkcji make_tuple() do tworzenia tupli (typy danych są rozpoznawane przez kompilator po typach argumentów). Istnieje szablon funkcji tie() do tworzenia tupli z referencjami (jako argumenty podaje się zmienne). Szablon tuple_size<tupletype>::value służy do podania liczby elementów w tupli. Szablon tuple_element<idx,tupletype>::type służy do podania typu elementu o indeksie idx w tupli.

Sprytne wskaźniki Sprytne wskaźniki są zdefiniowane w pliku nagłówkowym <memory>. Zastąpienie szablonu auto_ptr<>. Szablon klasy shared_pointer<> – wiele takich sprytnych wskaźników może przechowywać wskaźnik do tego samego obiektu, tak że obiekt ten oraz związane z nim zasoby zostaną zwolnione dopiero po likwidacji ostatniego sprytnego wskaźnika. Szablon klasy unique_pointer<> – tylko jeden sprytny wskaźnik może przechowywać wskaźnik do tego danego obiektu.

Ograniczenia liczbowe Typy numeryczne posiadają ograniczenia zależne od platformy i są zdefiniowane w szablonie numeric_limits<> (zdefiniowany w <limits>, stałe preprocesora są nadal dostępne w <climits> i <cfloat>). Wybrane składowe statyczne szablonu numeric_limits<>: is_signed, is_integer, is_exact, is_bounded, is_modulo, has_infinity, has_quiet_NaN, min(), max(), epsilon(). Przykłady: numeric_limits<char>::is_signed; numeric_limits<short>::is_modulo; numeric_limits<long>::max(); numeric_limits<float>::min(); numeric_limits<double>::epsilon();

Minimum i maksimum Obliczanie wartości minimalnej oraz maksymalnej: template <class T> inline const T& min (const T &a, const T &b) { return b<a ? b : a; } template <class T> inline const T& max (const T &a, const T &b) { return a<b ? b : a; } Istnieją też wersje tych szablonów z komparatorami (funkcja lub obiekt funkcyjny): template <class T, class C> inline const T& min (const T &a, const T &b, C comp) { return comp(b,a) ? b : a; } template <class T> inline const T& max (const T &a, const T &b, C comp) { return comp(a,b) ? b : a; }

Minimum i maksimum Przykład 1: bool int_ptr_less (int *p, int *q) { return *p<*q; } … int x = 33, y = 44; int *px = &x, *py = &y; int *pmax = std::max(px,py,int_ptr_less); Przykład 2: int i; long l; … // niezgodne typy argumentów // l = max(i,l); // BŁĄD l = std::max<long>(i,l); // OK

Zamiana wartości Zamiana dwóch wartości: template <class T> inline void swap (T &a, T &b) { T tmp(a); a = b; b = tmp; } Przykład: int x = 33, y = 44; … std::swap(x,y);

Operatory porównywania Cztery funkcje szablonowe (zdefiniowane w <utility>) na podstawie operatorów == i < definiują operatory porównań !=, <=, >= i >. Funkcje te są umieszczone w przestrzeni nazw std::rel_ops. Przykład: namespace std { namespace rel_ops { struct porown {}; } } class X : private porown { … public: bool operator== (const X &x) const throw(); bool operator< (const X &x) const throw(); }; … void foo () { // using namespace std::rel_ops; X x1, x2; … if (x1>=x2) { … } … if (x1!=x2) { … } … }

Kontenery Kontenery służą do przechowywania i zarządzania kolekcjami danych. Rodzaje kontenerów: Kontenery sekwencyjne, gdzie każdy element ma określoną pozycję. Na przykład: vector, deque, list. Kontenery sekwencyjne są zbudowane na tablicach dynamicznych albo na listach. Kontenery uporządkowane (w tym asocjacyjne), gdzie pozycja elementu zależy od jego wartości. Na przykład: set, multiset, map, multimap. Kontenery asocjacyjne są zbudowane na drzewach zrównoważonych. Kontenery nieuporządkowane, gdzie pozycja elementu nie zależy od jego wartości. Na przykład: unordered_set, unordered_multiset, unordered_map, unordered_multimap. Kontenery nieuporządkowane są zbudowane na tablicach z haszowaniem.

Elementy kontenerów Elementy kontenerów muszą spełniać wymagania podstawowe: element musi być kopiowalny (konstruktor kopiujący), element musi być przypisywalny (przypisanie kopiujące), element musi być zniszczalny (publiczny destruktor). W pewnych sytuacjach elementy kontenerów muszą spełniać wymagania dodatkowe: konstruktor domyślny (utworzenie niepustego kontenera), operator porównywania == (wyszukiwanie), operator porównywania < (kryterium sortowania).

Semantyka wartości a semantyka referencji Kontenery STL realizują semantykę wartości: tworzą wewnętrzne kopie swoich elementów oraz zwracają kopie tych elementów. Semantykę referencji można zaimplementować samodzielnie za pomocą inteligentnych wskaźników – wskaźniki te mają umożliwiać zliczanie referencji dla obiektów, do których odnoszą się wskaźniki.

Kontenery sekwencyjne – wektory Wektor vector<> (zdefiniowany w <vector>) przechowuje swoje elementy w tablicy dynamicznej. Uzyskujemy szybki dostęp do każdego elementu za pomocą indeksowania. Dołączanie i usuwanie elementów na końcu wektora jest bardzo szybkie, ale wstawienie lub usunięcie elementu ze środka zabiera więcej czasu. Przykład: vector<int> coll; … for (int i=1; i<=6; ++i) coll.push_back(i); … for (int i=0; i<coll.size(); ++i) cout << coll[i] << ’ ’; cout << endl;

Kontenery sekwencyjne – kolejki o dwóch końcach Kolejka o dwóch końcach deque<> (zdefiniowana w <deque>) przechowuje swoje elementy w tablicy dynamicznej, która może rosnąć w dwie strony. Uzyskujemy szybki dostęp do każdego elementu za pomocą indeksowania. Dołączanie i usuwanie elementów na końcu i na początku kolejki jest bardzo szybkie, ale wstawienie lub usunięcie elementu ze środka zabiera więcej czasu. Przykład: deque<float> coll; … for (int i=1; i<=6; ++i) coll.push_front(i*1.234); … for (int i=0; i<coll.size(); ++i) cout << coll[i] << ’ ’; cout << endl;

Kontenery sekwencyjne – listy Lista list<> (zdefiniowana w <list>) przechowuje swoje elementy w liście dwukierunkowej. W listach nie ma swobodnego dostępu do elementów kolekcji. Dołączanie i usuwanie elementów na końcu i na początku listy jest bardzo szybkie, ale dostanie się do elementu ze środka zabiera dużo czasu. Przykład: list<char> coll; … for (char c=’a’; c<=’z’; ++c) coll.push_back(c); … while (!coll.empty()) { cout << coll.front() << ’ ’; coll.pop_front(); } cout << endl;

Kontenery sekwencyjne – łańcuchy i tablice Obiektów klas łańcuchowych, czyli basic_string<>, string i wstring, można używać jak kontenerów sekwencyjnych. Są one podobne w zachowaniu do wektorów. Innym rodzajem kontenera może być tablica. Nie jest to klasa i nie ma żadnych metod ale konstrukcja STL umożliwia uruchamianie na tablicach różnych algorytmów (tak jak na kontenerach).

Kontenery uporządkowane Kontenery uporządkowane wykonują automatycznie sortowanie swoich elementów. Asocjacyjne kontenery uporządkowane przechowują pary klucz- wartość (odpowiednio first i second) i sortowanie następuje po kluczach. Domyślnie elementy lub klucze są porządkowane przy pomocy operatora <. Kontenery uporządkowane są implementowane w postaci zrównoważonych drzew BST (drzewa czerwono-czarne). Wszystkie kontenery uporządkowane posiadają domyślny parametr wzorca służący sortowaniu (domyślnym jest operator <). Rodzaje kontenerów: zbiory set<>, wielozbiory multiset<>, mapy map<> i multimapy multimap<>.

Kontenery nieuporządkowane Kontenery nieuporządkowane przechowują elementy w sposób nieuporządkowany (brak kryterium sortowania). Asocjacyjne kontenery nieuporządkowane przechowują pary klucz-wartość (odpowiednio first i second). Kontenery nieuporządkowane są implementowane w postaci tablic z haszowaniem. Wszystkie kontenery uporządkowane posiadają domyślny parametr wzorca służący sortowaniu (domyślnym jest operator <). Rodzaje kontenerów: zbiory unordered_set<>, wielozbiory unordered_multiset<>, mapy unordered_map<> i multimapy unordered_multimap<>.

Adaptatory kontenerów Adaptatory kontenerów to kontenery wykorzystujące ogólną strukturę innych kontenerów do realizacji pewnych specyficznych potrzeb. Adaptatorami kontenerów są stosy stack<>, kolejki queue<> i kolejki priorytetowe priority_queue<>. Przy definiowaniu takich kontenerów można podać jako drugi parametr typ kontenera do realizacji struktury (domyślnie jest to vector<>), na przykład: stack<int, vector<int>> st; queue<double> qu; priority_queue<string, deque<string>, less<string>> pq;

Iteratory Iterator to specjalny obiekt, który potrafi iterować po elementach kolekcji. Iterator ma zaimplementowaną semantykę wskaźnika – posiada operator wyłuskania elementu *, operatory przechodzenia do elementówsąsiednich ++ i -- oraz operatory porównywania pozycji == i !=. Wszystkie kontenery udostępniają funkcje tworzące iteratory do nawigowania po ich elementach – funkcja begin() zwraca iterator wskazujący na pozycję z pierwszym elementem w kolekcji a funkcja end() zwraca iterator wskazujący pozycję za ostatnim elementem. Każdy kontener definiuje dwa typy iteratorów – kontener::iterator przeznaczony do iterowania po elementach z możliwością odczytu i zapisu oraz kontener::const_iterator przeznaczony do iterowania po elementach tylko z możliwością odczytu.

Iteratory Przykład 1: list<char> coll; … list<char>::const_iterator pos; for (pos=coll.begin(); pos!=coll.end(); ++pos) cout << *pos << ’ ’; cout << endl; Przykład 2: list<char> coll; … list<char>::iterator pos; for (pos=coll.begin(); pos!=coll.end(); ++pos) *pos = toupper(*pos);