STL Standard Template Library



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

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

Programowanie i struktury danych

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

Algorytmy i Struktury Danych.

Zaawansowane programowanie w języku C++ Biblioteka standardowa

Kontenery i iteratory. Wykorzystanie kontenerów w praktyce.

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

STL Standardt Template Library (wprowadzenie)

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

Kurs programowania. Wykład 9. Wojciech Macyna

Kompletna dokumentacja kontenera C++ vector w -

Struktury Danych i Złożoność Obliczeniowa

Programowanie Komponentowe Zarządzanie obiektami: kontenery

STL: Lekcja 1&2. Filozofia STL

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

Biblioteka standardowa C++

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

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

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

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

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

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

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

Ćwiczenia IV - Kontenery (pojemniki)

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

Język C++ wykład VIII

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.

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

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

Wykorzystanie elementów z biblioteki standardowej C++: vector, list, complex oraz string.

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

Kontenery. Wykład 12. Programowanie (język C++) Rodzaje kontenerów. Przegląd kontenerów

Paradygmaty programowania

Jak Windows zarządza pamięcią?

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

java.util.* :Kolekcje Tomasz Borzyszkowski

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

WSTĘP DO INFORMATYKI. Struktury liniowe

Szablony funkcji i szablony klas

Zaawansowane programowanie w C++ (PCP)

Kontenery, algorytmy

Struktury danych: stos, kolejka, lista, drzewo

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

Szablony funkcji i klas (templates)

Stos LIFO Last In First Out

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

Algorytmy, iteratory, kolekcje niestandardowe

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

Listy, kolejki, stosy

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

BIBLIOTEKA STANDARDOWA C++

STL: kontenery. STL: kontenery. STL: kontenery. Typy kontenerów STL. STL: kontenery. STL: kontenery. multimap. Kontener map: przykład zadanie:

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

Opisy efektów kształcenia dla modułu

obiekty funkcyjne - funktory

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

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno

Wstęp do programowania

STL: kontenery. STL: kontenery. STL: kontenery. STL: kontenery. STL: kontenery. STL: kontenery

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

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

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

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

Realizacja ekstensji klasy. Paulina Strzelecka, Tomasz Roszkowski

Programowanie w języku Java. Kolekcje

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

Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04

Algorytmy. 1. Sortowanie 2. Statki i okręty. programowanie cz.7. poniedziałek, 2 marca 2009

Programowanie Proceduralne

C++: STL. STL: kontenery. STL: kontenery. STL: kontenery. STL: kontenery. Programowanie Obiektowe C++: Standard Template Library

Podstawy otwartych języków programowania Przechowywanie danych

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

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

Drzewa wyszukiwań binarnych (BST)

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

Operatory na rzecz typu TString

Wykład 2. Drzewa zbalansowane AVL i 2-3-4

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

Kolekcje mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

Java Collections Framework

Programowanie obiektowe w C++ Wykład 11

A. USYTUOWANIE MODUŁU W SYSTEMIE STUDIÓW

Kolekcje. Na podstawie:

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

Kolekcja (kontener) to po prostu obiekt, który grupuje wiele elementów w jeden twór.

prowadzący dr ADRIAN HORZYK /~horzyk tel.: Konsultacje paw. D-13/325

Wstęp do programowania obiektowego. STL - Standard Template Library

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

Tworzenie aplikacji w języku Java

Szablony klas, zastosowanie szablonów w programach

Wprowadzenie do szablonów szablony funkcji

Sortowanie bąbelkowe

C++: STL. STL: kontenery. STL: kontenery. STL: kontenery. STL: kontenery. Programowanie Obiektowe C++: Standard Template Library.

Lista, Stos, Kolejka, Tablica Asocjacyjna

Wyjątki (exceptions)

Wprowadzenie do szablonów szablony funkcji

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

Programowanie obiektowe i C++ dla matematyków

Sortowanie. Kolejki priorytetowe i algorytm Heapsort Dynamiczny problem sortowania:

Transkrypt:

Literatura Przykłady: STL Standard Template Library Nicolai M. Josuttis: C++ Standard Library: A tutorial and Reference, 1st, Pearson 1999, (Polska wersja: Nicolai M. Josuttis: C++ Biblioteka standardowa Podręcznik Programisty, Helion 2003, przykłady: ftp://ftp.helion.pl/przyklady/cpbspp.zip) Nicolai M. Josuttis: C++ Standard Library: A tutorial and Reference, 2nd, Addison Wesley Longman 2012, (uwzględnia standard C++11) Grębosz J.: Pasja C++, RM, W-wa http://www.josuttis.com/libbook/examples.zip Biblioteka STL to biblioteka wzorców, zawiera: klasy strumieniowe, klasy łańcuchowe STL Standard Template Library, (największa i najintensywniej rozwijana część biblioteki) Znacząco rozszerzona w standardzie C++11 (głównie część STL) Rozszerzenia języka i bibliotek C++11 nie są jeszcze w pełni wspierane przez kompilatory; Główne składniki Kontenery sekwencyjne i asocjacyjne Iteratory (interfejs pomiędzy algorytmami a kontenerami) Algorytmy Inne (obiekty funkcyjne, adaptory,...) Cechy: O-notacja Dane odseparowane od metod Zaprojektowane dla programowania wysokopoziomowego Zaprojektowane dla programowania wydajnego Wyszukiwanie w posortowanej tablicy: O(log2(n)) Wyszukiwanie w nieuporządkowanej tablicy: O(n) quicksort: O(n log2(n)) Sortowanie bąbelkowe: O(n2) Kontenery Sekwencyjne vector (tablica dynamiczna) dequeue (tablica dynamiczna dwukierunkowa) list (lista dwukierunkowa) Asocjacyjne

set (drzewo binarne), multiset map, multimap( "prawie" kontenery o tablica i string nie są kontenerami STL, ale można je przetwarzać za pomocą algorytmów STL o stos <stack> o kolejka <queue>, kolejka priorytetowa o zbiór bitowy <bitset> vector Zaimplementowany jako tablica dynamiczna szybkie push_back() szybki operator[] wolne insert() Wektor 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 1 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; Przykład 2 include <iostream> #include <vector> #include <algorithm> using namespace std; const int MAX = 10; int main() { int tab[max] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; vector<int> vi(tab, tab+max); ShowCollection(vi); vector<int>::iterator p = find(vi.begin(), vi.end(), 6);

cout << *p << endl; // 6 vector<int>::reverse_iterator q(p); cout << *q << endl; // 5 deque Zaimplementowany jako tablica dynamiczna szybkie push_back() (vector może być szybszy) szybkie push_front() (nieobsługiwany przez vector) szybki operator[] wolny insert() 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; list Zaimplementowana jako lista dwukierunkowa szybkie push_back() szybkie push_front() szybkie insert() Nie ma operatora operator[] 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; 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). Dla każdego węzła w drzewie BST zachodzą następujące własności: Wartości kluczy węzłów leżących w lewym poddrzewie węzła są mniejsze lub równe wartości klucza danego węzła. Wartości kluczy węzłów leżących w prawym poddrzewie węzła są większe lub równe wartości klucza danego węzła. 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. 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<>.

set Zaimplementowany jako drzewo binarne Sortowanie przy wstawianiu (porównywanie domyślnym operatorem<() ) Odpowiednik zbiorów matematycznych metoda find() szybkie insert() nie ma: push_back() nie ma: push_front() nie ma: operatora [] multiset Dozwolone powtórzenia tej samej wartości Uporządkowanie wewnątrz grupy elementów o tych samych wartościach jest niezdefiniowane multimap multiset dla par: klucz, wartość make_pair() map set dla par: klucz, wartość użyjemy make_pair() Przykład 1: list<char> coll; list<char>::const_iterator pos; for (pos=coll.begin(); pos!=coll.end(); ++pos) cout << *pos << << endl; Przykład 2: #include <iostream> #include <vector> #include <algorithm> const int MAX = 10; using namespace std; int main() {

int tab[max] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; vector<int> vi(tab, tab+max); ShowCollection(vi); vector<int>::iterator p = find(vi.begin(), vi.end(), 6); cout << *p << endl; //6 vector<int>::reverse_iterator q(p); cout << *q << endl; //5 vector<int>::iterator r(q.base()); cout << *r << endl; Iteratory Iterator to specjalny obiekt, który potafi 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 zachowują się jak zwyczajne wskaźniki... * -> ++ -- ==!= = (vector, deq: -, <, >, +(int) ) Iteratory działają dla wszystkich kontenerów! container.begin() // zwróć iterator do pierwszego elementu. container.end() // za ostatnim Iteratory odwrotne (reverse iterator) Mają interfejs zwykłych iteratorów Zachowują się odwrotnie container.rbegin() wskazuje na ostatni element (nie pozycję po ostatnim) container.rend() wskazuje na pozycję przed pierwszym! ++ to --, -- to ++, itd. Przykład 4: #include <iostream> #include <vector> #include <algorithm>

const int MAX = 10; using namespace std; int main() { int tab[max] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; vector<int> vi(tab, tab+max); ShowCollection(vi); vector<int>::iterator p = find(vi.begin(), vi.end(), 6); cout << *p << endl; // 6 vector<int>::reverse_iterator q(p); cout << *q << endl; // 5 vector<int>::iterator r(q.base()); cout << *r << endl; // 6 } Są jeszcze Iteratory strumieniowe, które zachowują się jak zwyczajne iteratory i mają interfejs zwykłych iteratorów ale operują na strumieniach i/o