STL: standardní knihovna šablon

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

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

Šablony, kontejnery a iterátory

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

Šablony, kontejnery a iterátory

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

Vector datový kontejner v C++.

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

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

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

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

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

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

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

Standardní algoritmy vyhledávací.

PB přednáška (23. listopadu 2015)

Funkční objekty v C++.

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

PB161 Programování v jazyku C++

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

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

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

Abstraktní datové typy

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

Standardní algoritmy v C++.

Ukazatele, dynamická alokace

Práce s knihovnami. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Programování se šablonami

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

Jazyk C++ II. Šablony a implementace

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

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

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

Kolekce, cyklus foreach

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

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

Přetěžování operátorů, dynamika objektů 2

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

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

ˇ razen ı rychlejˇ s ı neˇ z kvadratick e Karel Hor ak, Petr Ryˇsav y 20. dubna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT

Programovací jazyk Pascal

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

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

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

Programování v C++ David Bednárek.

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

Datové struktury 2: Rozptylovací tabulky

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

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

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

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

Šablonové metaprogramování v C++ Miroslav Virius KSI FJFI ČVUT

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

Algoritmizace prostorových úloh

Algoritmizace prostorových úloh

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

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

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

Výrazy, operace, příkazy

Abstraktní třídy, polymorfní struktury

Programování v C++ NPRG041 Programování v C /2016 David Bednárek

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

PB161 Programování v jazyce C++ Objektově Orientované Programování

Mělká a hluboká kopie

Algoritmizace a programování

Dynamické datové struktury I.

Funkce, podmíněný příkaz if-else, příkaz cyklu for

Dynamika objektů. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

Domácí úkoly 2013/14

Lineární datové struktury

Jazyk C++, některá rozšíření oproti C

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

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

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

Domácí úkoly Pokročilé programování v C++ LS 2015/2016. NPRG051 Pokročilé programování v C / DÚ

Algoritmy I, složitost

Dědění, polymorfismus

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

Ošetření chyb a výjimky

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

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

Základní datové struktury

bin arn ı vyhled av an ı a bst Karel Hor ak, Petr Ryˇsav y 23. bˇrezna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT

Obecná informatika. Matematicko-fyzikální fakulta Univerzity Karlovy v Praze. Podzim 2012

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

DSA, První krok: máme dokázat, že pro left = right vrátí volání f(array, elem, left, right)

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

Konstruktory a destruktory

Lineární datové struktury

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.

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Třídění dat. Ing. Hodál Jaroslav, Ph.D. VY_32_INOVACE_26 04

Výčtový typ strana 67

Jazyk C++ I. Šablony

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

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

Jazyk C++ I. Šablony 2

Úvod do programovacích jazyků (Java)

68. ročník Matematické olympiády 2018/2019

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

Transkript:

STL: standardní knihovna šablon 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++, A7B36PJC 04/2016, Lekce 10b https://cw.fel.cvut.cz/wiki/courses/a7b36pjc/start

STL je... Standard template library. Knihovna šablon, která je součástí standardní knihovny C++. Skládá se především z kolekcí a algoritmů. standard template library standardní knihovna šablon containers kolekce algorithms algoritmy <iterator> iterátory <functional> funkční objekty

Kolekce std::vector je příklad kolekce z STL. STL obsahuje celkem 13 druhů kolekcí v 9 hlavičkových souborech. <vector> std::vector <deque> std::deque C++11 <array> std::array <list> std::list <map> std::map std::multimap <set> std::set std::multiset C++11 <forward_list> std::forward_list C++11 <unordered_set> std::unordered_set std::unordered_multiset C++11 <unordered_map> std::unordered_map std::unordered_multimap

std::vector #include <vector> std::vector<int> container; container.push_back(1); container.push_back(2); container.push_back(3); std::cout << "c[1]: " << container[1] << "\n"; std::cout << "size: " << container.size() << "\n"; for (const auto& elem : container) { std::cout << "elem: " << elem << "\n"; c[1]: 2 size: 3 elem: 1 elem: 2 elem: 3

std::deque #include <deque> std::deque<int> container; container.push_back(2); container.push_back(3); container.push_front(1); std::cout << "c[1]: " << container[1] << "\n"; std::cout << "size: " << container.size() << "\n"; for (const auto& elem : container) { std::cout << "elem: " << elem << "\n"; c[1]: 2 size: 3 elem: 1 elem: 2 elem: 3

std::array C++11 #include <array> std::array<int, 3> container; container[0] = 1; container[1] = 2; container[2] = 3; std::cout << "c[1]: " << container[1] << "\n"; std::cout << "size: " << container.size() << "\n"; for (const auto& elem : container) { std::cout << "elem: " << elem << "\n"; c[1]: 2 size: 3 elem: 1 elem: 2 elem: 3

std::list #include <list> std::list<int> container; container.push_back(2); container.push_back(3); container.push_front(1); std::cout << "c[1]: " << container[1] << "\n"; std::cout << "size: " << container.size() << "\n"; for (const auto& elem : container) { std::cout << "elem: " << elem << "\n"; c[1]: 2 size: 3 elem: 1 elem: 2 elem: 3

std::forward_list C++11 #include <forward_list> std::forward_list<int> container; container.push_front(3); container.push_front(2); container.push_front(1); std::cout << "c[1]: " << container[1] << "\n"; std::cout << "size: " << container.size() << "\n"; for (const auto& elem : container) { std::cout << "elem: " << elem << "\n"; c[1]: 2 size: 3 elem: 1 elem: 2 elem: 3

Sekvenční kolekce (sequence containers) std::vector podporuje změnu velikosti na konci, tj. metody push_back a pop_back, a operaci []. std::deque navíc podporuje změnu velikosti na začátku, tj. metody push_front a pop_front. std::array má pevně určenou velikost, proto jsou zakázány operace push a pop, lze ale používat operaci []. (C++11) std::list je obousměrně zřetězený spojový seznam, je zakázána operace []. std::forward_list je jednosměrně zřetězený spojový seznam. Je zakázána operace [], metoda push_back, dokonce i metoda size. (C++11) Pokud jsou k dispozici, asymptotická složitost operací [], push, pop a size je O(1).

std::set #include <set> std::set<int> container; container.insert(3); container.insert(1); container.insert(2); container.insert(3); std::cout << "size: " << container.size() << "\n"; std::cout << "cnt3: " << container.count(3) << "\n"; for (const auto& elem : container) { std::cout << "elem: " << elem << "\n"; size: 3 cnt3: 1 elem: 1 elem: 2 elem: 3

std::multiset #include <set> std::multiset<int> container; container.insert(3); container.insert(1); container.insert(2); container.insert(3); std::cout << "size: " << container.size() << "\n"; std::cout << "cnt3: " << container.count(3) << "\n"; for (const auto& elem : container) { std::cout << "elem: " << elem << "\n"; size: 4 cnt3: 2 elem: 1 elem: 2 elem: 3 elem: 3

std::map #include <map> std::map<int, std::string> container; container.insert(std::make_pair(3, "abc")); container.insert(std::make_pair(1, "def")); container.insert(std::make_pair(2, "ghi")); container.insert(std::make_pair(3, "jkl")); // namespace std template<typename U, typename V> struct pair { U first; V second; ; std::cout << "c[3]: " << container[3] << "\n"; std::cout << "size: " << container.size() << "\n"; std::cout << "cnt3: " << container.count(3) << "\n"; for (const auto& elem : container) { std::cout << "elem: " << elem.first; std::cout << " " << elem.second << "\n"; c[3]: abc size: 3 cnt3: 1 elem: 1 def elem: 2 ghi elem: 3 abc

std::map #include <map> std::map<int, std::string> container; container[3] = "abc"; container[1] = "def"; container[2] = "ghi"; container[3] = "jkl"; // namespace std template<typename U, typename V> struct pair { U first; V second; ; std::cout << "c[3]: " << container[3] << "\n"; std::cout << "size: " << container.size() << "\n"; std::cout << "cnt3: " << container.count(3) << "\n"; for (const auto& elem : container) { std::cout << "elem: " << elem.first; std::cout << " " << elem.second << "\n"; c[3]: jkl size: 3 cnt3: 1 elem: 1 def elem: 2 ghi elem: 3 abc

std::multimap #include <map> std::multimap<int, std::string> container; container.insert(std::make_pair(3, "abc")); container.insert(std::make_pair(1, "def")); container.insert(std::make_pair(2, "ghi")); container.insert(std::make_pair(3, "jkl")); // namespace std template<typename U, typename V> struct pair { U first; V second; ; std::cout << "c[3]: " << container[3] << "\n"; std::cout << "size: " << container.size() << "\n"; std::cout << "cnt3: " << container.count(3) << "\n"; for (const auto& elem : container) { std::cout << "elem: " << elem.first; std::cout << " " << elem.second << "\n"; c[3]: --- size: 4 cnt3: 2 elem: 1 def elem: 2 ghi elem: 3 abc elem: 3 jkl

Asociativní kolekce (associative containers) std::set<t> reprezentuje množinu s prvky typu T. std::map<k, V> ukládá hodnoty typu V s klíči typu K. Klíč s hodnotou je reprezentován objektem typu std::pair<k, V>. std::multiset umožňuje, aby se v kolekci opakovaly prvky. std::multimap umožňuje, aby se v kolekci opakovaly klíče. Metoda count určí, kolikrát se v kolekci vyskytuje daný prvek nebo klíč. Metoda insert vloží prvek nebo klíč s hodnotou do kolekce. Metoda find nalezne daný prvek nebo klíč. Prvky v set, multiset a klíče v map, multimap musí podporovat operaci <. Metody count, insert a find mají asymptotickou složitost O(log n), kde n je momentální velikost kolekce.

Procházení kolekcí Pracujeme-li postupně s každým prvkem, říkáme, že kolekci procházíme, nebo že přes kolekci iterujeme. for (auto& elem : container) { std::cout << "elem: " << elem << "\n"; for (auto i = begin(container); i!= end(container); ++i) { std::cout << "elem: " << *i << "\n"; for (auto i = container.begin(); i!= container.end(); ++i) { std::cout << "elem: " << *i << "\n"; for (std::vector<int>::iterator i = container.begin(); i!= container.end(); ++i) { std::cout << "elem: " << *i << "\n"; elem: 1 elem: 2 elem: 3 // C++11 // C++11 // C++11 // C++03

Procházení kolekcí Pokud prvky potřebujeme jenom číst, ne měnit, můžeme použít const, cbegin a cend, const_iterator. for (const auto& elem : container) { std::cout << "elem: " << elem << "\n"; for (auto i = cbegin(container); i!= cend(container); ++i) { std::cout << "elem: " << *i << "\n"; elem: 1 elem: 2 elem: 3 // C++11 // C++14 for (auto i = container.cbegin(); i!= container.cend(); ++i) { // C++11 std::cout << "elem: " << *i << "\n"; for (std::vector<int>::const_iterator i = container.begin(); i!= container.end(); ++i) { std::cout << "elem: " << *i << "\n"; // C++03

Procházení kolekcí Pokud prvky potřebujeme v opačném pořadí, použijeme rbegin a rend, případně reverse_iterator. elem: 3 elem: 2 elem: 1 for (auto i = rbegin(container); i!= rend(container); ++i) { std::cout << "elem: " << *i << "\n"; // C++14 for (auto i = container.rbegin(); i!= container.rend(); ++i) { // C++11 std::cout << "elem: " << *i << "\n"; for (std::vector<int>::reverse_iterator i = container.rbegin(); // C++03 i!= container.rend(); ++i) { std::cout << "elem: " << *i << "\n";

Algoritmy Algoritmy v STL pracují s daty prostřednictvím iterátorů. Jak získat iterátory? Z kolekcí, jako návratovou hodnotu metod begin, end, cbegin, cend, rbegin, rend, crbegin, crend, find, insert, lower_bound, upper_bound, equal_range Jinak, viz. std::back_inserter, std::front_inserter, std::inserter, std::istream_iterator, std::ostream_iterator Sekvence dat se reprezentuje pomocí dvou iterátorů, počátečního a konečného. Počáteční iterátor ukazuje na první prvek. Konečný iterátor ukazuje za poslední prvek. begin end prvek 1 prvek 2 prvek 3 prvek 4 prvek 5

std::sort (std::stable_sort) #include <vector> #include <algorithm> std::vector<int> v ({ 6, 5, 3, 9, 7, 4, 0, 2, 8, 1 ); std::sort(begin(v), end(v)); for (const auto& elem : v) { std::cout << elem << " "; 0 1 2 3 4 5 6 7 8 9

std::accumulate #include <vector> #include <algorithm> std::vector<int> v ({ 6, 5, 3, 9, 7, 4, 0, 2, 8, 1 ); auto r = std::accumulate(begin(v), end(v), 0); std::cout << "soucet: " << r << "\n"; soucet: 45

std::rotate #include <vector> #include <algorithm> std::vector<int> v ({ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ); std::rotate(begin(v), begin(v) + 5, end(v)); for (const auto& elem : v) { std::cout << elem << " "; 5 6 7 8 9 0 1 2 3 4

std::unique #include <vector> #include <algorithm> std::vector<int> v ({ 1, 5, 3, 3, 4, 0, 2, 1, 2, 4 ); std::sort(begin(v), end(v)); // 0 1 1 2 2 3 3 4 4 5 auto u = std::unique(begin(v), end(v)); // 0 1 2 3 4 5 3 4 4 5 v.erase(u, end(v)); // 0 1 2 3 4 5 for (const auto& elem : v) { std::cout << elem << " "; 0 1 2 3 4 5

std::shuffle C++11 #include <vector> #include <algorithm> #include <random> std::vector<int> v ({ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ); std::random_device rd; std::mt19937 re(rd()); std::shuffle(begin(v), end(v), re); for (const auto& elem : v) { std::cout << elem << " "; 6 5 3 9 7 4 0 2 8 1

Úprava funkcionality std::sort Algoritmus std::sort určuje správné pořadí prvků pomocí operace <. Prvky kolekce jsou seřazeny v neklesajícím pořadí. Co když je ale chceme naopak v nerostoucím pořadí? Potřebujeme, aby std::sort používal místo operace < operaci >. Pomocí třetího, nepovinného parametru můžeme poskytnout vlastní operaci, kterou std::sort použije. Operaci můžeme předat čtyřmi způsoby: Předáme ukazatel na funkci. Předáme funkční objekt. Předáme jiné iterátory. Předáme lambda funkci.

Jak seřadit prvky v nerostoucím pořadí? Možnost 1: Předáme ukazatel na funkci comp. #include <vector> #include <algorithm> bool comp(int a, int b) { return a > b; std::vector<int> v ({ 6, 5, 3, 9, 7, 4, 0, 2, 8, 1 ); std::sort(begin(v), end(v), &comp); for (const auto& elem : v) { std::cout << elem << " "; 9 8 7 6 5 4 3 2 1 0

Jak seřadit prvky v nerostoucím pořadí? Možnost 2a: Předáme instanci funkčního objektu Comp. #include <vector> #include <algorithm> struct Comp { bool operator()(int a, int b) { return a > b; ; std::vector<int> v ({ 6, 5, 3, 9, 7, 4, 0, 2, 8, 1 ); std::sort(begin(v), end(v), Comp()); for (const auto& elem : v) { std::cout << elem << " "; 9 8 7 6 5 4 3 2 1 0

Jak seřadit prvky v nerostoucím pořadí? Možnost 2b: Předáme instanci funkčního objektu std::greater. #include <vector> #include <algorithm> #include <functional> std::vector<int> v ({ 6, 5, 3, 9, 7, 4, 0, 2, 8, 1 ); std::sort(begin(v), end(v), std::greater<int>()); for (const auto& elem : v) { std::cout << elem << " "; 9 8 7 6 5 4 3 2 1 0

Jak seřadit prvky v nerostoucím pořadí? Možnost 3: Předáme jiné iterátory. #include <vector> #include <algorithm> std::vector<int> v ({ 6, 5, 3, 9, 7, 4, 0, 2, 8, 1 ); std::sort(rbegin(v), rend(v)); for (const auto& elem : v) { std::cout << elem << " "; 9 8 7 6 5 4 3 2 1 0

Jak seřadit prvky v nerostoucím pořadí? Možnost 4: Předáme lambda funkci. #include <vector> #include <algorithm> std::vector<int> v ({ 6, 5, 3, 9, 7, 4, 0, 2, 8, 1 ); std::sort(begin(v), end(v), [](int a, int b){ return a > b; ); for (const auto& elem : v) { std::cout << elem << " "; 9 8 7 6 5 4 3 2 1 0

Jiný příklad: Uspořádej kolekci tak, aby se v ní nacházely nejdříve liché, potom sudé prvky. #include <vector> #include <algorithm> std::vector<int> v ({ 6, 5, 3, 9, 7, 4, 0, 2, 8, 1 ); std::sort(begin(v), end(v), [](int a, int b){ return (a & 1) > (b & 1); ); for (const auto& elem : v) { std::cout << elem << " "; 5 3 9 7 1 6 4 0 2 8

Lambda funkce C++11 Speciální syntaxe, která umožňuje vytvořit funkční objekt. Do lambda funkce vstupují data dvěma způsoby: Standardními parametry. Uvádíme je klasicky v kulatých závorkách a s typem. Proměnné, které jsou k dispozici v místě vytvoření lambda funkce, můžeme použít uvnitř těla. Mechanismus, který to umožňuje, se nazývá zachycení (capture). Zachycené proměnné uvádíme v hranatých závorkách a bez typu. int dnivmesici = 31; auto prictimesic = [dnivmesici] (int cislodne) { return cislodne + dnivmesici; ; dnivmesici = 40; nejakecislodne = prictimesic(nejakecislodne); // přičte 31

Zachycení referencí C++11 Výchozí způsob zachycení je hodnotou; zachycená proměnná je zkopírována. Takováto proměnná se také nesmí uvnitř lambdy měnit, pokud neurčíme, že chceme lambdu s proměnným stavem (mutable). Pokud chceme změnit hodnotu zachycené proměnné, musíme ji zachytit referencí. Před její název přidáme symbol &. int i = 0; int j = 0; auto foo = [i, &j](int add) mutable { i += add; // neovlivní vnější i, toto i je kopie j += add; // ovlivní vnější j, toto j je reference ; i = 2; j = 2; foo(3); std::cout << i << ", " << j << "\n"; // 2, 5

Úprava funkcionality std::accumulate Algoritmus std::accumulate provádí nad prvky součet (operaci +). Tuto operaci můžeme změnit čtvrtým, nepovinným parametrem. Nabízí se např. upravit funkcionalitu tak, aby se provedl součin, příp. zřetězení kolekce řetězců. Nesmíme ale zapomenout na třetí parametr, který slouží jako první mezivýsledek. Když mezivýsledek nemáme, musíme použít tzv. neutrální hodnotu pro danou operaci. Neutrální hodnota pro součet je 0. Neutrální hodnota pro součin je 1. Neutrální hodnota pro zřetězení je "".

Příklad: Zjisti součin prvků v kolekci. #include <vector> #include <algorithm> std::vector<int> v ({ 9, 8, 7, 6, 5, 4, 3, 2, 1 ); Pozor, neutrální hodnota pro součin je 1, ne 0. auto r = std::accumulate(begin(v), end(v), 1, [](int a, int b){ return a * b; ); std::cout << "soucin: " << r << "\n"; soucin: 362880

Další algoritmy std::count std::mismatch std::equal std::find std::copy std::fill std::transform std::generate std::reverse std::nth_element std::lower_bound* std::upper_bound* std::equal_range* spočti počet výskytů najdi první prvek, kde se dvě posloupnosti liší zjisti, zda mají dvě posloupnosti shodné prvky najdi prvek zkopíruj posloupnost vyplň posloupnost daným prvkem proveď operaci nad posloupností ulož výsledky opakovaného volání funkce do posloupnosti obrať posloupnost na n-tou pozici umísti prvek, který by tam byl po seřazení najdi první prvek, který je větší, nebo roven hodnotě najdi první prvek, který je větší, než hodnota najdi podposloupnost, jejíž prvky jsou rovny hodnotě více informací: http://en.cppreference.com/w/cpp/algorithm *pole musí být seřazené

Děkuji za pozornost.

Hashující kolekce (unordered containers) C++11 Kolekce std::unordered_set, std::unordered_multiset, std::unordered_map a std::unordered_multimap používají hashování. Jejich metody count, insert a find mají průměrnou asymptotickou složitost O(1). Prvky nebo klíče musí podporovat hashování, tj. musí existovat odpovídající specializace šablony std::hash. Specializace šablon je nad rámec této přednášky. Více informací a příklady: http://en.cppreference.com/w/cpp/utility/hash Vestavěné typy (int, double, apod.) a typy ze standardní knihovny (např. std::string) lze jako prvky nebo klíče používat bez problémů, odpovídající specializace std::hash jsou součástí standardní knihovny.

Co je to iterátor? Aby byl nějaký objekt považován za iterátor, musí podporovat jisté operace. Iterátor je koncept. STL rozeznává více druhů iterátorů. Nejmocnější je random access iterator, iterátor s náhodným přístupem. input iterator forward iterator bidirectional iterator random access iterator

Co je to iterátor? (podrobněji) Aby byl nějaký objekt považován za iterátor, musí podporovat jisté operace. Iterátor je koncept. STL rozeznává více druhů iterátorů. Používá pojmy input iterator, output iterator, forward iterator, bidirectional iterator, random access iterator. Pro představu (a velmi zhruba): Objekt i, který umí ++i a číst *i, je input iterator. Objekt i, který umí ++i a zapsat *i, je output iterator. Input iterator i, který také umí i++ a inkrementací nezpůsobí zneplatnění předešlých dat, je forward iterator. Forward iterator i, který také umí --i a i-- je bidirectional iterator. Bidirectional iterator i, který také umí i += N, je random access iterator. Input iterator, který je také output iterator, se nazývá mutable.

Iterátory s náhodným přístupem Objekt i odpovídá konceptu iterátor s náhodným přístupem, pokud: Podporuje operace ++i, --i, i++, i--, *i, i-> Podporuje operace i[n], i+=n, i-=n, i+n, i-n, N+i, kde N je celé číslo Podporuje operace ==,!=, <, >, <=, >= Všechny tyto operace se chovají rozumně, viz. http://en.cppreference.com/w/cpp/iterator Všimněte si vztahu mezi iterátory a ukazateli: Pokud lze nějaká operace provést s ukazatelem, tak lze také provést s iterátorem s náhodným přístupem a bude fungovat dle očekávání. Iterátor s náhodným přístupem tedy můžeme považovat za zobecněný ukazatel. Můžeme mluvit o tom, že iterátor na něco ukazuje. Navíc, ukazatele jsou iterátory s náhodným přístupem. Objekty typu int*, char**, atd., splňují všechny požadavky.