Jazyk C++ II. STL knihovna kontejnery část 1



Podobné dokumenty
Jazyk C++ II. STL knihovna kontejnery část 2

Šablony, kontejnery a iterátory

Šablony, kontejnery a iterátory

PROGRAMOVÁNÍ V C++ CVIČENÍ. Michal Brabec

PB161 Programování v jazyce C++ Přednáška 3

Šablony funkcí a tříd (Templates) Genericita

map, multimap - Asociativní pole v C++.

Programování v jazyce C a C++

Programování v C++ 2, 4. cvičení

Množina v C++ (set, multiset).

Iterátory v C++. int pole[20]; for (int *temp = pole, temp!= &pole[20]; temp++) { *temp = 0;

Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++

Vector datový kontejner v C++.

PB161 Programování v jazyce C++ Přednáška 3

OBJEKTOVÉ PROGRAMOVÁNÍ V C++ V PŘÍKLADECH 8 Proudová knihovna 8.1 Hierarchie proudů Standardně zavedené proudy

Více o konstruktorech a destruktorech

Hornerovo schéma. je algoritmus výpočtu hodnoty polynomu P(x) v bodě x 0. eliminuje výpočet i-té mocniny převodem na postupné násobení.

Lineární datové struktury

PB161 Programování v jazyku C++

Programování v C++ 1, 5. cvičení

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Abstraktní datové typy

Standardní algoritmy v C++.

PB161 Programování v jazyce C++ Přednáška 4

Jazyk C++ II. Výjimky

Lineární spojový seznam (úvod do dynamických datových struktur)

Konstruktory a destruktory

Standardní algoritmy vyhledávací.

konstruktory a destruktory (o)

Kolekce, cyklus foreach

přetížení operátorů (o)

Funkční objekty v C++.

Programování v C++ 3, 3. cvičení

Algoritmizace prostorových úloh

PB přednáška (26. října 2015)

Základní datové struktury

PB161 Programování v jazyce C++ Přednáška 9

Pole a kolekce. v C#, Javě a C++

Semestrální práce 2 znakový strom

Teoretické minimum z PJV

Dynamické datové typy a struktury

Programování v C++, 2. cvičení

PB161 Programování v jazyce C++ Přednáška 6

Algoritmizace prostorových úloh

Programování v C++ 2, 7. cvičení

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Programování v jazyce C a C++

int ii char [16] double dd název adresa / proměnná N = nevyužito xxx xxx xxx N xxx xxx N xxx N

Cvičení z programování v C++ ZS 2016/2017 Přemysl Čech

Ukazatele, dynamická alokace

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

PB161 Programování v jazyce C++ Přednáška 10

Lineární datové struktury

Řetězce. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Programování v C++ 2, 8. cvičení

přetížení operátorů (o)

Da D to t v o é v ty t py IB111: Datové typy

Kolekce ArrayList. Deklarace proměnných. Import. Vytvoření prázdné kolekce. napsal Pajclín

Jazyk C++ I. Šablony 2

Úvod do programovacích jazyků (Java)

ADT/ADS = abstraktní datové typy / struktury

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

Konec a tak. PB173 Programování v C++11. Vladimír Štill, Jiří Weiser. Fakulta Informatiky, Masarykova Univerzita. 15.

Jazyk C++ II. Šablony a implementace

Úvod do programovacích jazyků (Java)

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

PB161 Programování v jazyce C++ Přednáška 10

Základy programování (IZP)

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

Dynamické datové struktury I.

ABSTRAKTNÍ DATOVÉ TYPY

Mělká a hluboká kopie

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

PB161 Programování v jazyce C++ Přednáška 2

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

IB015 Neimperativní programování. Časová složitost, Typové třídy, Moduly. Jiří Barnat Libor Škarvada

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Úvod do programování - Java. Cvičení č.4

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Algoritmizace a programování

Vícerozměrná pole. Úvod do programování 2 Tomáš Kühr

Náplň. v Jednoduché příklady na práci s poli v C - Vlastnosti třídění - Způsoby (algoritmy) třídění

Struktura programu v době běhu

Spojový seznam. Jan Kybic.

Stručný obsah První týden Druhý týden 211 Třetí týden 451 Rejstřík 787

Programování II. Návrh programu I 2018/19

8 Třídy, objekty, metody, předávání argumentů metod

Pointery II. Jan Hnilica Počítačové modelování 17

O datových typech a jejich kontrole

Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března

Algoritmy II. Otázky k průběžnému testu znalostí

Množina čísel int stl-set-int.cpp

Domácí úkoly 2013/14

Základy programování (IZP)

Spojová implementace lineárních datových struktur

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

Transkript:

Jazyk C++ II STL knihovna kontejnery část 1 AR 2013/2014 Jazyk C++ II

STL kontejnery Kontejnery jsou třídy, jejichž instance slouží k uskladňování dat. Každý druh kontejneru má své výhody a nevýhody. Kontejnery dělíme na dvě základní skupiny: Posloupnosti a Asociativní kontejnery. AR 2013/2014 Jazyk C++ II 2

Parametry šablon STL kontejnerů První parametr šablony je vždy typ ukládaných hodnot. Výjimkou jsou map<> a multimap<>, u kterých to představují první dva parametry: typ klíče a typ hodnoty. Poslední parametr je vždy alokátor. Instance třídy, která se stará o alokaci paměti pro daný kontejner. Implicitní hodnotou tohoto parametru je standardní třída allocator. Tento parametr se zadává pouze pokud potřebuje řídit práci s pamětí jinak než standardním způsobem. Třídy, které fungují jako adaptéry mají jako druhý parametr třídu podkladového kontejneru. AR 2013/2014 Jazyk C++ II 3

Společné vlastnosti kontejnerů Požadavky, které by měli splňovat všechny kontejnery knihovny STL. Tři základní vlastnosti: Všechny kontejnery poskytují hodnotovou, ne odkazovou sémantiku. Všechny prvky udržují svoje pořadí v kontejneru. Operace nejsou bezpečné, proto musí být u parametru splňovat určité požadavky. AR 2013/2014 Jazyk C++ II 4

Společné operace kontejnerů Šablony v STL jsou navrženy tak, aby je bylo možno používat jednotným způsobem. Pokud to jde. Operace splňují všechny základní vlastnosti kontejnerů. Každá kontejnerová třída obsahuje implicitní konstruktor, kopírovací konstruktor a destruktor. Kontejnery lze také inicializovat prvky určitého rozsahu. AR 2013/2014 Jazyk C++ II 5

Společné operace kontejnerů Inicializace prvky jiného kontejneru: //l je vázaný seznam typů int std::list<int> l; //kopírování všech prvků seznamu l jako typu float do vektoru std::vector<float> c(l.begin(), l.end()); Inicializace prvky pole: int pole[] = { 2, 3, 17, 33, 45, 77 }; //kopírování všech prvků pole do sady std::set<int> c(pole, pole+sizeof(pole)/sizeof(pole[0]); AR 2013/2014 Jazyk C++ II 6

Společné operace kontejnerů Operace TypKontejneru() TypKontejneru(TypKontejneru c2) TypKontejneru(zacatek, konec) ~TypKontejneru() size() empty() Účel Vytvoření prázdného kontejneru bez prvků. Kopírující kontejner. Vytvoření kontejneru a inicializace kopiemi prvků rozsahu <zacatek, konec). Destruktor. Vrací aktuální počet prvků. Vrací informaci o tom, zda je kontejner prázdný. AR 2013/2014 Jazyk C++ II 7

Společné operace kontejnerů Operace max_size() Účel Maximální možný počet prvků. ==,!=, <, <=, >, >= Porovnávací kontejnery. = Přiřazení všech prvků kontejneru 2 do kontejneru 1. swap(typkontejneru), swap(c1, c2) begin(), rbegin() end(), rend() Vymění data kontejnerů. Vrací iterátor prvního prvku (zpětné iterace). Vrací iterátor pozice za poslední prvek (zpětné iterace). AR 2013/2014 Jazyk C++ II 8

Společné operace kontejnerů Operace insert(pozice, prvek) erase(zacatek, konec) clear() get_allocator() Účel Vloží kopii prvku (návratová hodnota a význam iterátoru pozice jsou různé). Vyjme všechny prvky v rozsahu <zacatek, konec). Vyprázdní kontejner. Vrací paměťový model kontejneru. AR 2013/2014 Jazyk C++ II 9

Zveřejňované datové typy Každý kontejner povinně zveřejňuje řadu datových typů, a to jako veřejně přístupné deklarace typedef uvedené v šabloně třídy kontejneru. Jedná se především o typy odvozené od typu ukládaných hodnot. Datový typy: value_type typ ukládaných hodnot. key_type typ klíče. pointer (const_pointer) typ ukazatele na typ uložených hodnot. reference (const_reference) typ (konstantní) reference na typ uložených hodnot. iterator (const_iterator) typ (konstantního) iterátoru použitelného k procházení daného kontejneru a ke změnám jeho hodnot. reverese_iterator (const_reverse_iterator)- typ (konstantního) reverzní iterátor. AR 2013/2014 Jazyk C++ II 10

Posloupnosti Kontejnery, u kterých záleží na pořadí dat. Data jsou v posloupnosti uložena zpravidla v pořadí, v němž byla do kontejneru uložena. Není to ale podmínkou. V některých případech má smysl u nich operace třídění (seřazení podle velikosti). Implementace posloupností je zpravidla založena na dynamicky zvětšovaném poli nebo na lineárním seznamu. AR 2013/2014 Jazyk C++ II 11

Posloupnosti Kontejnery posloupností reprezentující : vektor, seznam, oboustranná fronta, zásobník a fronta. AR 2013/2014 Jazyk C++ II 12

Vektory (vector) Vektor spravuje prvky v dynamickém poli. Standard specifikuje pouze omezení a složitosti jeho operací. Hlavičkový soubor <vector> namespace std { template <class T, class Allocator = allocator<t> > class vector; } s AR 2013/2014 Jazyk C++ II 13

Vlastnosti vektorů Jedná se o druh seřazené kolekce prvky vektoru udržují vždy určité pořadí. Poskytují náhodný přístup přistupování v konstantním čase. Složitosti operací: Připojování/mazání prvků na konci kontejneru, Připojování/mazání prvků uprostřed nebo na začátku kontejneru. AR 2013/2014 Jazyk C++ II 14

Velikost a kapacita vektorů Vektory poskytují standardní operace pro zjišťování velikosti size(), empty() a max_size(). Na zjišťování maximální kapacity prvků v aktuálně vyhrazené paměti využívá metodu capacity(). Pokud program pracuje ve vektoru s ukazateli, odkazy nebo iterátory, nebo pokud je naším cílem rychlost aplikace, musíme počítat s kapacitou vektoru. Nová alokace zneplatní všechny odkazy, ukazatele a iterátory prvků vektoru. Nová alokace zabírá čas. AR 2013/2014 Jazyk C++ II 15

Velikost a kapacita vektorů Pokud se chceme vyhýbat nové alokaci Můžeme si vyhradit určitou kapacitu ještě před tím, že ji začneme využívat pomocí metody reserve(). Metoda reserve() nejde volat k zmenšení kapacity. Použít konstruktor vektoru s parametrem pro inicializaci hodnot. std::vector<int> v; v.reserve(20); //vyhradi pamet std::vector<double> v2(5); Tímto způsobem zajistíme, že odkazy zůstanou platné, dokud nedojde k překročení kapacity. Pokud dojde k překročení kapacity Pomocí metody swap(). AR 2013/2014 Jazyk C++ II 16

Využití vektorů Vektor můžeme použít jako normální pole. Ve vektorech můžeme např. ukládat data normálních řetězců jazyka C typu char * nebo const char *: std::vector<char> v; v.resize(30); strcpy(&v[0], "Kopirovani vektoru char"); printf("%s\n", &v[0]); AR 2013/2014 Jazyk C++ II 17

Vektor Obvyklá struktura Prvky Povolené duplicity Kategorie iterátoru Hledání prvků Vkládaní/vyjímání prvků je rychlé Vkládání/vyjímání ruší platnost iterátoru, ukazatelů a odkazů Uvolnění paměti vyjmutých prvků Možnost rezervace paměti Transakční bezpečnost (úspěch nebo bez činnosti) Dynamické pole Hodnota Ano S náhodným přístupem Pomalé Na konci Při nové alokaci Nikdy Ano Vkládání/vyjímání na konci AR 2013/2014 Jazyk C++ II 18

Kdy použít vektor? Implicitně bychom měli používat vektory. Mají nejjednodušší vnitřní datovou strukturu a poskytují náhodný přístup. K datům lze přistupovat pohodlně a zpracování je dostatečně rychlé. AR 2013/2014 Jazyk C++ II 19

Obousměrná fronta (dequeue) Velmi podobná vektoru. Spravuje prvky v dynamické poli, Poskytuje náhodný přístup a Má téměř stejné rozhraní jako vektor. Rozdíl spočívá v tom, že u obousměrné fronty je dynamické pole otevřené na obou stranách. Umožňuje rychlé vkládání a mazání na konci i na začátku kontejneru. AR 2013/2014 Jazyk C++ II 20

Obousměrná fronta Hlavičkový soubor <deque> namespace std { template <class T, class Allocator == allocator<t> > class deque; } AR 2013/2014 Jazyk C++ II 21

Vlastnosti obousměrných front Vkládání a vyjímání prvků je rychlé na začátku i na konci. Vkládání a vyjímání prvků uprostřed je relativně pomalé. Vnitřní struktura má pro přístup k prvkům jeden odkaz navíc, takže vlastní přístup k prvkům a pohyb iterátorů je v obousměrných frontách obvykle trochu pomalejší. Iterátory musí být chytré ukazatele speciálního typu, ne obyčejné ukazatele, protože musí přeskakovat mezi různými bloky. Iterátory mají náhodný přístup. Obousměrné fronty neposkytují podporu řízení kapacity a okamžiku nové alokace. Pokud již nejsou bloky paměti dále používány, je možné jejich uvolnění, takže velikost paměti obsazené obousměrnou frontou se může zmenšovat. (závisí na implementaci.) AR 2013/2014 Jazyk C++ II 22

Obousměrná fronta Obvyklá struktura Prvky Povolené duplicity Kategorie iterátoru Hledání prvků Vkládaní/vyjímání prvků je rychlé Vkládání/vyjímání ruší platnost iterátoru, ukazatelů a odkazů Uvolnění paměti vyjmutých prvků Možnost rezervace paměti Transakční bezpečnost (úspěch nebo bez činnosti) Pole polí Hodnota Ano S náhodným přístupem Pomalé Na konci a na začátku vždy Nikdy Ano Vkládání/vyjímání na konci a na začátku AR 2013/2014 Jazyk C++ II 23

Kdy použít obousměrnou frontu? Pokud často vkládáme nebo vyjímáme prvky na začátku a na konci kontejneru, měli bychom použít kontejner obousměrné fronty. Oproti vektoru pracuje s více bloky než s jedním. AR 2013/2014 Jazyk C++ II 24

Seznam (list) Seznam spravuje své prvky v obousměrně vázaném seznamu. Hlavičkový soubor <list> namespace std { template <class T, class Allocator = allocator<t> > class list; } AR 2013/2014 Jazyk C++ II 25

Vlastnosti seznamů Seznamy neposkytují náhodný přístup. Pomalý přístup k libovolnému členu. Mazání a vkládání prvků je rychlé na každé pozici. Vnitřně se provádí změna pouze v ukazatelových hodnotách. Vkládání a mazání prvků neukončuje platnost ukazatelů, odkazů a iterátorů odkazujících na jiné prvky. Nemůže nám nastat, že se operace provede jenom z půlky, protože Každá operace uspěje nebo Neprovede žádnou činnost. AR 2013/2014 Jazyk C++ II 26

Vlastnosti seznamů Seznamy neposkytují operátor indexu a ani metodu at(), protože nepodporují náhodný přístup. Seznamy neposkytují operace pro kapacitu a novou alokaci. Seznamy poskytují nové speciální implementace členské funkce pro přemísťování prvků. AR 2013/2014 Jazyk C++ II 27

Nové operace seznamů Operace c.remove(hod) c.remove_if(op) c.unique() c.unique(op) c1.splice(poz, c2) Účel Vyjímá všechny prvky s hodnotou hod. Vyjímá všechny prvky, pro které funkce op(prvek) vrací hodnotu true. Vyjímá duplicity po sobě jdoucích prvků se stejnou hodnotou. Vyjímá duplicity po sobě jdoucích prvků, u kterých funkce op() vrací hodnotu true. Přesouvá všechny prvky z kontejneru c2 do c1 před pozici danou iterátorem poz. AR 2013/2014 Jazyk C++ II 28

Nové operace seznamů Operace c1.splice(poz, c2, c2poz) c1.splice(poz, c2, c2zac, c2kon) Účel Přesouvá prvek na pozici c2poz z kontejneru c2 před pozici poz kontejneru c1 (kontejnery c1 a c2 mohou být shodné). Přesouvá všechny prvky rozsahu <c2zac, c2kon) kontejneru c2 před pozici poz v c1 (kontejnery c1 a c2 mohou být shodné). c.sort() Řadí všechny prvky pomocí operátory <. c.sort(op) Řadí všechny prvky pomocí funkce op(). AR 2013/2014 Jazyk C++ II 29

Nové operace seznamů Operace c1.merge(c2) c1.merge(c2, op) c.reverse() Účel Pokud oba kontejnery obsahují seřazené prvky, přesune všechny prvky z kontejneru c2 do c1 tak, že všechny sloučené prvky budou i nadále seřazené. Viz předchozí metoda s tím, že prvky jsou seřazené pravidlem určeným funkcí op(). Obrátí pořadí všech prvků. AR 2013/2014 Jazyk C++ II 30

Seznam Obvyklá struktura Prvky Povolené duplicity Kategorie iterátoru Hledání prvků Vkládaní/vyjímání prvků je rychlé Vkládání/vyjímání ruší platnost iterátoru, ukazatelů a odkazů Uvolnění paměti vyjmutých prvků Možnost rezervace paměti - Transakční bezpečnost (úspěch nebo bez činnosti) Obousměrně vázaný seznam Hodnota Ano Obousměrný Velmi pomalé Kdekoliv Nikdy Vždy Všechny operace kromě funkce sort() a přiřazování AR 2013/2014 Jazyk C++ II 31

Kdy použít seznamy? Pokud často vkládáme, vyjímáme a přemisťujeme prvky uprostřed kontejneru, vyplatí se použít seznamy. Seznamy poskytují speciální členské funkce pro přemisťování prvků z jednoho kontejneru do druhého v konstantním čase. Pokud potřebujeme kontejner, který zpracovává výjimky tak, že každá operace buďto uspěje nebo nevykoná žádnou činnost, měli bychom použít seznam nebo asociativní kontejner. AR 2013/2014 Jazyk C++ II 32

Literatura JOSUTTIS, Nicolai. C Standardní knihovna a STL: kompletní průvodce. Vyd. 1. Brno: CP Books, 2005, 743 s. Programování. ISBN 80-251-0511-3. VIRIUS, Miroslav. 1001 tipů a triků pro C. Vyd. 1. Brno: Computer Press, 2011, 451, xx s. ISBN 978-80-251-2941-8. AR 2013/2014 Jazyk C++ II 33