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

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

Šablony, kontejnery a iterátory

Šablony, kontejnery a iterátory

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

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

Vector datový kontejner v C++.

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

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

Jazyk C++ II. Šablony a implementace

Základní datové struktury

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í.

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

Funkční objekty v C++.

Standardní algoritmy vyhledávací.

6. blok část C Množinové operátory

Jazyk C++ II. Výjimky

Kolekce, cyklus foreach

Datové struktury 2: Rozptylovací tabulky

Cílem kapitoly je seznámit studenta se seznamem a stromem. Jejich konstrukci, užití a základní vlastnosti.

Lineární datové struktury

AVL stromy. pro každý uzel u stromu platí, že rozdíl mezi výškou jeho levého a pravého podstromu je nejvýše 1 stromy jsou samovyvažující

Algoritmizace prostorových úloh

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

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

Standardní algoritmy v C++.

Stromy. Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy

Další příklady. Katedra softwarového inženýrství. Katedra teoretické informatiky, Fakulta informačních technologii, ČVUT v Praze. Karel Müller, 2011

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

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

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

ABSTRAKTNÍ DATOVÉ TYPY

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

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

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

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

Semestrální práce 2 znakový strom

Algoritmizace prostorových úloh

Adresní vyhledávání (přímý přístup, zřetězené a otevřené rozptylování, rozptylovací funkce)

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

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

Programování v jazyce C a C++

součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů:

Prioritní fronta, halda

Dynamické datové typy a struktury

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

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

Konstruktory a destruktory

PB161 Programování v jazyku C++

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

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

ABSTRAKTNÍ DATOVÉ TYPY (ADT)

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

Programování v jazyce C a C++

Abstraktní datové typy

bfs, dfs, fronta, zásobník, prioritní fronta, halda

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

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

Inovace výuky prostřednictvím šablon pro SŠ

vyhledávací stromové struktury

Objektově orientovaný přístup

Dynamické datové struktury I.

Jazyk C++ I. Polymorfismus

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

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

Algoritmy a datové struktury

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

Red Black strom (Red Black Tree) Úvod do programování. Rotace. Red Black strom. Rotace. Rotace

bfs, dfs, fronta, zásobník, prioritní fronta, halda

Amortizovaná složitost. Prioritní fronty, haldy (binární, d- regulární, binomiální, Fibonacciho), operace nad nimi a jejich složitost

Algoritmizace a programování

PROGRAMOVÁNÍ V C++ CVIČENÍ

Access Tabulka letní semestr 2013

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

boolean hasnext() Object next() void remove() Kolekce

Jazyk C++ 1. Blok 3 Objektové typy jazyka C++ Třída. Studijní cíl. Doba nutná k nastudování. Průvodce studiem

Rozptylovací tabulky

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

C++ přetěžování funkcí a operátorů. Jan Hnilica Počítačové modelování 19

Více o konstruktorech a destruktorech

Přijímací zkouška - informatika

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

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

Datové struktury. alg12 1

Hrátky s funkcemi. PV173 Programování v C++11. Vladimír Štill, Jiří Weiser. Fakulta Informatiky, Masarykova Univerzita. 29.

2 Datové struktury. Pole Seznam Zásobník Fronty FIFO Haldy a prioritní fronty Stromy Hash tabulky Slovníky

Michal Krátký, Miroslav Beneš

Paměť počítače. alg2 1

Maturitní otázky z předmětu PROGRAMOVÁNÍ

DATABÁZE MS ACCESS 2010

Stromy, haldy, prioritní fronty

Algoritmizace prostorových úloh

C# konzole Podíl dvou čísel, podmínka IF

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

TGH07 - Chytré stromové datové struktury

Dynamicky vázané metody. Pozdní vazba, virtuální metody

ČÁST 1. Zahřívací kolo. Co je a k čemu je návrhový vzor 33

Generické programování

Dynamické datové struktury III.

Transkript:

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

Asociativní kontejnery Slovníky u kterých pořadí dat nemá smysl. Kontejner si sám určuje, kam který údaj uloží. Údaje mají tvar klíč/hodnota. Zadáme-li klíč efektivně vyhledat odpovídající hodnotu. Implementace těchto kontejnerů je založena na vyvážených binárních vyhledávacích stromu. Dříve na hash tabulkách. AR 2013/2014 Jazyk C++ II 2

Asociativní kontejnery Asociativní kontejnery reprezentují: množina, multimnožina, mapy, multimapy. AR 2013/2014 Jazyk C++ II 3

Množina (set) a multimnožina (multiset) Řadí svoje prvky podle určitého pravidla. AR 2013/2014 Jazyk C++ II 4

Množina a multimnožina Hlavičkový soubor <set> - jak pro kontejner set tak i multiset. namespace std { template <class T, class Compare = less<t>, class Allocator = allocator<t> > class set; } template <class T, class Compare = less<t>, class Allocator = allocator<t> > class multiset; AR 2013/2014 Jazyk C++ II 5

Množiny a multimnožiny Do parametru šablony přibylo pravidlo pro řazení. template <class T, class Compare = less<t>, class Allocator = allocator<t> > Funkční objekt less<>() řadí prvky jejich porovnávacím operátorem <. AR 2013/2014 Jazyk C++ II 6

Vlastnosti množin a multimnožin Jedná se o asociativní třídy kontejnerů. Jsou implementovány prostřednictvím vyvážených binárních stromů. AR 2013/2014 Jazyk C++ II 7

Vlastnosti množin a multimnožin Automatické řazení Poskytují dobrý výkon při hledání prvku s určitou hodnotu logaritmická složitost. Není možné přímo měnit hodnotu prvku došlo by k porušení správného pořadí. Potřeba vyjmout prvek se starou hodnotou a následně vložit nový prvek s požadovanou hodnotou. Množiny a multimnožiny neposkytují operátory pro přímý přístup k prvkům. Nepřímý přístup prostřednictvím iterátorů je z pohledu iterátoru omezen konstantní hodnotou prvku. AR 2013/2014 Jazyk C++ II 8

Speciální vyhledávací operace množin a multimnožin Operace c.count(prvek) c.find(prvek) c.lower_bound(prvek) c.upper_bound(prvek) c.equal_range(prvek) Účel Vrací počet prvků s hodnotou prvek. Vrací pozici prvního prvku s hodnotou prvek nebo c.end(). Vrací první pozici, na kterou by byl prvek vložen (první prvek >= prvek). Vrací poslední pozici, na kterou by byl prvek vložen (první prvek > prvek). Vrací první a poslední pozici, na kterou by byl prvek vložen (rozsah prvků == prvek). AR 2013/2014 Jazyk C++ II 9

Množiny 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) Binární strom Hodnota Ne Obousměrný (konstantní prvky) Rychlé Nikdy Vždy Všechny operace kromě vkládání více prvků AR 2013/2014 Jazyk C++ II 10

Kdy použijeme množinu? Pokud potřebujeme často hledat prvky podle určitého pravidla, použijeme množinu nebo multimnožinu s řazením prvků podle tohoto pravidla. AR 2013/2014 Jazyk C++ II 11

Multimnožiny 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) Binární strom Hodnota Ano Obousměrný (konstantní prvky) Rychlé Nikdy Vždy Všechny operace kromě vkládání více prvků AR 2013/2014 Jazyk C++ II 12

Mapy a multimapy Kontejnery map a multimap spravují prvky jako páry klíč/hodnota. Automaticky řadí své prvky podle určitého pravidla, které je použito pro aktuální klíč. Odlišnost mezi mapami a multimapami je umožnění mít duplicitního klíče. AR 2013/2014 Jazyk C++ II 13

Mapy a multimapy AR 2013/2014 Jazyk C++ II 14

Mapy a multimapy Hlavičkový soubor <map> - jak pro kontejner mapa tak i multimapa. namepsace std { template <class key, class Compare = less<key>, class Allocator = allocator<pair<const Key, T> > > class map; } template <class key, class Compare = less<key>, class Allocator = allocator<pair<const Key, T> > > class multimap; AR 2013/2014 Jazyk C++ II 15

Vlastnosti map a multimap AR 2013/2014 Jazyk C++ II 16

Vlastnosti map a multimap Mapy a multimapy řadí své prvky automaticky podle klíčů, a tak poskytují dobrou výkonnost při vyhledávání prvků s určitým klíčem. Špatná výkonnost při vyhledávání prvků podle hodnoty. Automatické řazení jako u sad a multisad. Není možné přímo měnit hodnotu klíče prvku Museli bychom nejdříve odebrat starý prvek a Následně vložit prvek s novou hodnotou klíče. AR 2013/2014 Jazyk C++ II 17

Speciální vyhledávací operace map a multimap Operace c.count(klic) c.find(klic) c.lower_bound(klic) c.upper_bound(klic) c.equal_range(klic) Účel Vrací počet prvků s klíčem klic. Vrací pozici prvního prvku s klíčem klic nebo c.end(). Vrací první pozici, na kterou by byl prvek s klíčem klic vložen (první prvek s klíčem >= klic). Vrací poslední pozici, na kterou by byl prvek s klíčem klic vložen (první prvek s klíčem > klic). Vrací první a poslední pozici, na kterou by byl prvek s klíčem klic vložen (rozsah prvků jejihž klíč == klic). AR 2013/2014 Jazyk C++ II 18

Mapy a asociativní pole Asociativní kontejnery obvykle neposkytují možnost přímého přístupu k prvků. Místo toho musíme používat iterátory. Mapy představují ale výjimku z tohoto pravidla. Můžeme u nekonstantních map přistupovat k prvkům přímo prostřednictvím operátoru index. Index tohoto operátoru představuje klíč, který ho jednoznačně identifikuje. Index tedy může mít jakýkoliv typ. AR 2013/2014 Jazyk C++ II 19

Mapy a asociativní pole Příklad: std::map<std::string, double> coll; coll["klica"] = 7.7; Se vyhodnotí následovně: Jestliže již prvek s klíčem "klica" existuje, vrací výše uvedený výraz hodnotou tohoto prvku odkazem. Pokud neexistuje žádný prvek s klíčem "klica", výraz automaticky vkládá nový prvek s klíčem "klica" a hodnotou dodanou implicitním konstruktorem odpovídajícího typu hodnoty prvku. Následně se provede přiřazení hodnoty 7.7 novému nebo již existujícímu prvku. Nevýhoda zde spočívá v tom, že nový prvek můžeme omylem vložit: std::cout << coll["klicb"] << std::endl; AR 2013/2014 Jazyk C++ II 20

Mapa 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) Binární strom Pár klíč/hodnota Pouze u hodnot, klíče nesmí být duplicitní Obousměrný (konstantní klíče) Rychlé u klíčů Nikdy Vždy Všechny operace kromě vkládání více prvků AR 2013/2014 Jazyk C++ II 21

Multimapa 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) Binární strom Pár klíč/hodnota Ano Obousměrný (konstantní klíče) Rychlé u klíčů Nikdy Vždy Všechny operace kromě vkládání více prvků AR 2013/2014 Jazyk C++ II 22

Kdy použít mapu a multimapu? Pokud zpracováváme páry klíč/hodnota, použijte mapu nebo multimapu. Pokud potřebujeme asociativní pole, použijeme mapu. Potřebujeme-li slovník, použijeme multimapu. AR 2013/2014 Jazyk C++ II 23

Adaptéry Třídy, které obalují jinou třídu, využívají jejich služeb a poskytují pouze potřebné rozhraní. Jako podkladové třídy můžeme použít libovolnou posloupnost. Standardně se používá oboustranná fronta implicitní hodnota druhého parametru adaptérů. Kontejnery adaptérů: Třída stack<>, Třída queue<> a Třída priority_queue<>. AR 2013/2014 Jazyk C++ II 24

Začlenění STL kontejnerů Máme tři různé přístupy k začlenění kontejneru do knihovny STL: Invazní poskytnutí rozhraní, které knihovna STL vyžaduje. Neinvazní rozhraní mezi algoritmy a kontejnerem napíšeme nebo poskytneme zvláštní iterátory. Obalovací pomocí obou předchozích přístupů napíšeme třídu, která obalí naši datovou strukturu rozhraním obvyklým pro kontejnery STL knihovny. AR 2013/2014 Jazyk C++ II 25

Další kontejnery Bitové množiny (bitset) Definované v hlavičkovém souboru <bitset> Pro manipulaci s posloupnostmi bitů o pevně zadané délce. Parametrem je celé číslo (ne datový typ). Specializace šablony vector<bool> Optimalizovaná pro práci s pamětí. Ukládání hodnot jako jednotlivé bity. AR 2013/2014 Jazyk C++ II 26

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 27