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

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

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

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

Šablony, kontejnery a iterátory

Šablony, kontejnery a iterátory

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

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

Standardní algoritmy vyhledávací.

PB161 Programování v jazyku C++

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

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

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

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

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

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

Vector datový kontejner v C++.

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

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

Kolekce, cyklus foreach

Funkční objekty v C++.

STL: standardní knihovna šablon

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

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

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

Abstraktní datové typy

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

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

Základní datové struktury

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

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

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

Dynamické datové struktury I.

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

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

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

Více o konstruktorech a destruktorech

Konstruktory a destruktory

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

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

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

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

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

Standardní algoritmy v C++.

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

Dynamické datové struktury IV.

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

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

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 9

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

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

5. Vyhledávání a řazení 1

Ukazatele, dynamická alokace

ALG 09. Radix sort (přihrádkové řazení) Counting sort. Přehled asymptotických rychlostí jednotlivých řazení. Ilustrační experiment řazení

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

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

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

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

Jazyk C# (seminář 6)

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

Jazyk C++ II. Šablony a implementace

ADT/ADS = abstraktní datové typy / struktury

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

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

Algoritmizace prostorových úloh

PB161 Programování v C++ Proudy pro standardní zařízení Souborové proudy Paměťové proudy Manipulátory

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

Dynamické datové struktury III.

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

for (int i = 0; i < sizeof(hodnoty) / sizeof(int); i++) { cout<<hodonoty[i]<< endl; } cin.get(); return 0; }

Algoritmizace prostorových úloh

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

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

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

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

Dynamické datové typy a struktury

Datové typy v Javě. Tomáš Pitner, upravil Marek Šabo

Datové struktury 1: Základní datové struktury

Jazyk C++ I. Polymorfismus

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

Úvod do programování 6. hodina

Martin Flusser. December 15, 2016

Datové struktury 2: Rozptylovací tabulky

Programování v jazyce C a C++

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

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

IAJCE Přednáška č. 9. int[] pole = new int[pocet] int max = pole[0]; int id; for(int i =1; i< pole.length; i++) { // nikoli 0 if (Pole[i] > max) {

Úvod Přetěžování Generika Kolekce Konec. Programování v C# Další jazykové konstrukce. Petr Vaněček 1 / 31

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

Úvod do programovacích jazyků (Java)

Datové struktury. alg12 1

Programování: základní konstrukce, příklady, aplikace. IB111 Programování a algoritmizace

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

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

PŘETĚŽOVÁNÍ OPERÁTORŮ

Základy programování (IZP)

Lineární datové struktury

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

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

Algoritmizace a programování

Transkript:

PB161 Programování v jazyce C++ Přednáška 3 Kontejnery Iterátory Algoritmy Nikola Beneš 4. října 2016 PB161 přednáška 3: kontejnery, iterátory, algoritmy 4. října 2016 1 / 25

Standardní knihovna C++ Už jsme viděli std::string std::vector jednoduchý vstup/výstup Kontejnery objekty, které mohou obsahovat jiné objekty Iterátory inteligentní ukazatele dovnitř kontejnerů Algoritmy operace nad kontejnery nebo jejich částmi Princip generického programování kontejnery smí obsahovat objekty libovolných typů; algoritmy jsou nezávislé na konkrétním typu. PB161 přednáška 3: kontejnery, iterátory, algoritmy 4. října 2016 2 / 25

Kontejnery & iterátory PB161 přednáška 3: kontejnery, iterátory, algoritmy 4. října 2016 3 / 25

Typy kontejnerů Sekvenční array (C++11) klasické pole vector dynamické pole, může se zvětšovat deque obousměrná fronta, rychlé přidávání/odebírání prvků forward_list (C++11), list zřetězený seznam Asociativní set uspořádaná množina map asociativní pole (slovník), uspořádané dle klíče multiset, multimap umožňují opakování klíčů unordered_set, unordered_map, unordered_multiset, unordered_multimap neuspořádané verze (hash tabulky), C++11 Adaptéry stack (zásobník), queue (fronta), priority_queue (prioritní fronta) PB161 přednáška 3: kontejnery, iterátory, algoritmy 4. října 2016 4 / 25

Související datové struktury Dvojice a ntice pair dva objekty různých (nebo stejných) typů tuple (C++11) fixní počet objektů různých (nebo stejných) typů Řetězce string fungují podobně jako kontejnery PB161 přednáška 3: kontejnery, iterátory, algoritmy 4. října 2016 5 / 25

Dvojice a ntice <utility> Šablonové třídy pair a tuple deklarace std::pair<int, char> p; std::tuple<int, char, std::string> t; std::pair<int, char> p1(42, 'x'); std::tuple<int, char, std::string> t1{13, 'z', "Kva"}; přístup k prvkům p.first = 17; p.second = 'a'; std::get<1>(t) = 'x'; std::get<2>(t) = "www"; PB161 přednáška 3: kontejnery, iterátory, algoritmy 4. října 2016 6 / 25

Dvojice a ntice (pokr.) <utility> Užitečné pomocné funkce automatická dedukce typů auto p = std::make_pair("james Bond", 007); // jaký je typ? auto t = std::make_tuple(1, 1l, 1.0, 1.f); // jaký je typ? někdy není potřeba, stačí inicializace složenými závorkami void f(std::tuple<int, double, std::string>); f({3, 3.14, "Pi"}); rozbalení ntice (ntice referencí) std::tuple<int, char, double> getsomething(); int x; char c; double d; std::tie(x, c, d) = getsomething(); PB161 přednáška 3: kontejnery, iterátory, algoritmy 4. října 2016 7 / 25

Sekvenční kontejnery std::array<typ, počet> pevný počet prvků; klasické pole ve stylu C s jinou syntaxí std::vector<typ> dynamické pole; rychlé přidávání/odebírání prvků na jednom konci použitelné ve většině případů, kdy chceme uchovávat seznam objektů std::deque<typ> rychlé přidávání/odebírání prvků z obou konců std::forward_list<typ>, std::list<typ> zřetězené seznamy (jednosměrné, obousměrné) používejte jen pokud je skutečně potřebujete (typicky mnohem pomalejší než vector) PB161 přednáška 3: kontejnery, iterátory, algoritmy 4. října 2016 8 / 25

Sekvenční kontejnery (pokr.) Typické operace inicializace, přiřazení, porovnávání (operátory ==, < apod.) indexování (operátor [], metoda at()) empty(), size() swap() prohození obsahu s jiným kontejnerem stejného typu Vkládání push_back(), push_front(), insert() apod. varianty s emplace místo vkládaného prvku berou parametry pro konstruktor vytvoří nový prvek a vloží jej může být efektivnější Práce s iterátory begin(), end() PB161 přednáška 3: kontejnery, iterátory, algoritmy 4. října 2016 9 / 25

Iterátory základní myšlenka: inteligentní ukazatele pro vector a string typická implementace: ukazatele jiné kontejnery ale mohou mít složitější iterátory různé druhy podle kontejneru sekvenční procházení různé další operace různé metody kontejnerů používají iterátory minimálně begin() a end() begin() vrací iterátor na začátek kontejneru end() vrací iterátor za konec kontejneru PB161 přednáška 3: kontejnery, iterátory, algoritmy 4. října 2016 10 / 25

Iterátory pro vector Syntax: std::vector<typ>::iterator (pro čtení i zápis) std::vector<typ>::const_iterator (jen pro čtení) std::vector<int> vec{10, 20, 30}; std::vector<int>::iterator vecit = vec.begin(); std::cout << *vecit << '\n'; // vypíše 10 ++vecit; // posunutí na další prvek std::cout << *vecit << '\n'; // vypíše 20 --vecit; // posunutí na předchozí prvek [ukázka insert] PB161 přednáška 3: kontejnery, iterátory, algoritmy 4. října 2016 11 / 25

Iterátory pro vector (pokr.) Procházení vektoru (aneb život před C++11) for (vector<int>::iterator it = vec.begin(); it!= vec.end(); ++it) { cout << *it << endl; *it = 17; } // vec.end() ukazuje ZA poslední prvek vektoru [ukázka: range-for] Invalidace iterátorů v případě, že se vektor zvětší, přestávají iterátory být platné PB161 přednáška 3: kontejnery, iterátory, algoritmy 4. října 2016 12 / 25

Uspořádaná množina <set> Šablonová třída set prvky se neopakují prvky se dají uspořádat (operátorem <) typická implementace: stromy (často red-black trees) rychlé (O(log n)) vkládání, mazání, vyhledávání iterátory vždy konstantní (neměnitelné) Operace insert vrací dvojici std::pair<iterator, bool> iterátor na vložený (nebo už existující) prvek true, pokud byl prvek vložen erase může brát hodnotu prvku nebo bere iterátor, příp. rozsah iterátorů pak vrací iterátor na další prvek (od C++11) find vrací iterátor nebo end() a další (empty, size, ) [ukázka] PB161 přednáška 3: kontejnery, iterátory, algoritmy 4. října 2016 13 / 25

Asociativní kontejner <map> Šablonová třída map asociativní pole, slovník mapování klíčů na hodnoty uspořádání podle klíčů klíče se nemohou opakovat funguje podobně jako set dvojice (klíč, hodnota): klíč se nesmí modifikovat, hodnota ano [ukázka: insert, erase, find] PB161 přednáška 3: kontejnery, iterátory, algoritmy 4. října 2016 14 / 25

Asociativní kontejner (pokr.) <map> Operátor [] uvnitř operátoru [] je klíč pokud záznam neexistuje, automaticky se vytvoří používejte opatrně (dávejte přednost spíš insert a find) std::map<std::string, int> namestouco; namestouco["nikola Benes"] = 72525; // přístup k neexistujícímu záznamu jej vytvoří if (namestouco["james Bond"] == 7) { /*... */ } auto iter = namestouco.find("james Bond"); if (iter!= namestouco.end()) { cout << iter->second << endl; // vypíše 0 } PB161 přednáška 3: kontejnery, iterátory, algoritmy 4. října 2016 15 / 25

Algoritmy PB161 přednáška 3: kontejnery, iterátory, algoritmy 4. října 2016 16 / 25

Knihovna algoritmů <algorithm> různé užitečné algoritmy funkcionální styl programování v C++ využívá iterátorů jednotný způsob, jak zacházet s objekty uvnitř kontejnerů rozsah (range) dvojice iterátorů iterátor na první prvek rozsahu iterátor za poslední prvek rozsahu algoritmy fungují i s klasickými poli ukazatele fungují jako iterátory ale možná je lepší preferovat std::array (C++11) PB161 přednáška 3: kontejnery, iterátory, algoritmy 4. října 2016 17 / 25

Řazení Algoritmus sort int arr[8] = {27, 8, 6, 4, 5, 2, 3, 0}; std::sort(arr, arr + 8); // C++11 std::array<int, 8> arr2 = {27, 8, 6, 4, 5, 2, 3, 0}; std::sort(arr2.begin(), arr2.end()); std::vector<int> vec = {9, 6, 17, -3}; std::sort(vec.begin(), vec.end()); std::vector<int> vec2 = {9, 6, 17, -3, 0, 1}; std::sort(vec.begin() + 2, vec.end() - 1); // co se stane? PB161 přednáška 3: kontejnery, iterátory, algoritmy 4. října 2016 18 / 25

Řazení (pokr.) Porovnávání implicitně: operátor < můžeme dodat vlastní funkci bool pred(int x, int y) { return y < x; } std::sort(vec.begin(), vec.end(), pred); některé porovnávací funkční objekty už máme v knihovně algoritmů připravené std::sort(vec.begin(), vec.end(), std::greater<int>()); Poznámka: sort nemusí být stabilní, proto standardní knihovna obsahuje ještě algoritmus stable_sort PB161 přednáška 3: kontejnery, iterátory, algoritmy 4. října 2016 19 / 25

Kopírování Algoritmus copy zdrojový rozsah, cílový iterátor je třeba zajistit, aby v cílovém kontejneru bylo dost místa std::set<int> s = {15, 6, -7, 20}; std::vector<int> vec; vec.resize(7); // vec obsahuje {0, 0, 0, 0, 0, 0, 0} std::copy(s.begin(), s.end(), vec.begin() + 2); // vec nyní obsahuje {0, 0, -7, 6, 15, 20, 0} užitečné speciální iterátory std::inserter (pro set; volá insert), std::back_inserter (pro vector; volá push_back) [ukázka] PB161 přednáška 3: kontejnery, iterátory, algoritmy 4. října 2016 20 / 25

Kopírování (pokr.) Algoritmus copy_if (C++11) kopírují se jen objekty splňující daný predikát funkce vracející bool bool isodd(int num) { return (num % 2)!= 0; } std::array<int, 5> arr = {1, 2, 3, 4, 5}; std::set<int> s = {-7, 6, 15, 20} std::copy_if(s.begin(), s.end(), arr.begin(), isodd); // arr nyní obsahuje {-7, 15, 3, 4, 5}; PB161 přednáška 3: kontejnery, iterátory, algoritmy 4. října 2016 21 / 25

Další užitečné algoritmy Algoritmus transform kopírování s modifikací dvě varianty první varianta: unární funkce jako parametr (map) druhá varianta: dva zdroje, binární funkce (zipwith) Algoritmus accumulate sečte všechny objekty v zadaném rozsahu pomocí operátoru + umožňuje dodat vlastní funkci místo + počáteční hodnota akumulace probíhá zleva (foldl) a mnohé další find, find_if, fill, generate, iota, atd. PB161 přednáška 3: kontejnery, iterátory, algoritmy 4. října 2016 22 / 25

Funkční objekty algoritmy často berou jako (volitelný) parametr funkci ve skutečnosti to může být komplikovanější objekt, tzv. funkční objekt objekt třídy s přetíženým operátorem () o tom později Lambda funkce (od C++11) std::vector<int> v = {10, 7, 5, 4, 2, 3}; int oddcount = std::count_if(v.begin(), v.end(), [](int x){ return x % 2 == 1; }); trochu nad rámec tohoto předmětu, ale občas se hodí PB161 přednáška 3: kontejnery, iterátory, algoritmy 4. října 2016 23 / 25

Lambda funkce Syntax [zachytávání](parametry){ tělo funkce } zachytávání: [] nic [x] proměnnou x hodnotou [&x] proměnnou x referencí [x,&y] proměnnou x hodnotou a proměnnou y referencí [=] všechny proměnné vyskytující se uvnitř těla funkce hodnotou [&] všechny proměnné vyskytující se uvnitř těla funkce referencí [ukázka] PB161 přednáška 3: kontejnery, iterátory, algoritmy 4. října 2016 24 / 25

Závěrečný kvíz https://kahoot.it PB161 přednáška 3: kontejnery, iterátory, algoritmy 4. října 2016 25 / 25