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

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

Standardní algoritmy vyhledávací.

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

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

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

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

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

PB161 Programování v jazyku C++

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

Vector datový kontejner v C++.

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

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

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

Kolekce, cyklus foreach

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

Funkční objekty v C++.

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

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

STL: standardní knihovna šablon

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

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

Abstraktní datové typy

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

Základní datové struktury

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

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

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

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

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

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

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

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

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

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

Konstruktory a destruktory

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

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

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

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

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

Ukazatele, dynamická alokace

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

Dynamické datové struktury I.

Více o konstruktorech a destruktorech

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

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

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

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

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

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

Standardní algoritmy v C++.

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

Jazyk C++ II. Šablony a implementace

Mělká a hluboká kopie

Jazyk C# (seminář 6)

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

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

Programování v jazyce C a C++

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

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

Dynamické datové typy a struktury

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

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

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

Dynamické datové struktury IV.

Pole a Funkce. Úvod do programování 1 Tomáš Kühr

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

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

Algoritmizace prostorových úloh

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

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

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

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

Programování v C++ 2, 8. 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++ 3, 3. cvičení

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

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

Jazyk C++ I. Polymorfismus

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

Základy programování (IZP)

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

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

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

ADT/ADS = abstraktní datové typy / struktury

Algoritmizace prostorových úloh

Dynamické datové struktury III.

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.

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

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

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

Úvod do programovacích jazyků (Java)

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

Úvod do programovacích jazyků (Java)

Transkript:

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

Automatická dedukce typů (od C++11) Specifikátor auto smíme použít místo typu v místě deklarace kompilátor automaticky dedukuje typ podle toho, čím se proměnná inicializuje auto znamená vždy hodnotu, nikdy referenci auto& znamená referenci const auto& znamená konstantní referenci for (auto person : people) {... } for (auto& person : people) {... } for (const auto& person : people) {... } PB161 přednáška 3: kontejnery, iterátory, algoritmy 2. října 2018 2 / 27

Automatická dedukce typů (od C++11) Kdy je vhodné používat auto? skutečný typ je příliš komplikovaný std::vector<int>::iterator it = vec.begin(); auto it = vec.begin(); skutečný typ je jasně čitelný z okolního kódu auto ptr = std::make_unique<listelement>(); for (const auto& animal : animals) {... } nevíme, jaký bude výsledný typ šablony, lambdy PB161 přednáška 3: kontejnery, iterátory, algoritmy 2. října 2018 3 / 27

Standardní knihovna C++ Už jsme viděli std::string std::vector jednoduchý vstup/výstup Kontejnery Iterátory objekty, které mohou obsahovat jiné objekty 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 2. října 2018 4 / 27

Kontejnery & iterátory PB161 přednáška 3: kontejnery, iterátory, algoritmy 2. října 2018 5 / 27

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 2. října 2018 6 / 27

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 2. října 2018 7 / 27

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"; lecture03_01.cpp PB161 přednáška 3: kontejnery, iterátory, algoritmy 2. října 2018 8 / 27

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 std::tuple: oficiálně až od C++17, některé překladače i 14 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(); lecture03_02.cpp, lecture03_03.cpp PB161 přednáška 3: kontejnery, iterátory, algoritmy 2. října 2018 9 / 27

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ů, který se má za běhu programu dynamicky měnit 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 2. října 2018 10 / 27

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() lecture03_04.cpp PB161 přednáška 3: kontejnery, iterátory, algoritmy 2. října 2018 11 / 27

Iterátory základní myšlenka: inteligentní ukazatele pro vector a string typická implementace: (něco jako) 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(), ale často i jiné begin() vrací iterátor na začátek kontejneru end() vrací iterátor za konec kontejneru algoritmy používají iterátory https://en.cppreference.com/w/cpp/iterator PB161 přednáška 3: kontejnery, iterátory, algoritmy 2. října 2018 12 / 27

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 lecture03_05.cpp PB161 přednáška 3: kontejnery, iterátory, algoritmy 2. října 2018 13 / 27

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 Invalidace iterátorů v případě, že se vektor zvětší, přestávají iterátory být platné čtěte dokumentaci lecture03_06.cpp PB161 přednáška 3: kontejnery, iterátory, algoritmy 2. října 2018 14 / 27

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, ) lecture03_07.cpp PB161 přednáška 3: kontejnery, iterátory, algoritmy 2. října 2018 15 / 27

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 Operace podobně jako u set insert, erase, find, lecture03_08.cpp PB161 přednáška 3: kontejnery, iterátory, algoritmy 2. října 2018 16 / 27

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 } lecture03_09.cpp PB161 přednáška 3: kontejnery, iterátory, algoritmy 2. října 2018 17 / 27

Algoritmy PB161 přednáška 3: kontejnery, iterátory, algoritmy 2. října 2018 18 / 27

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 2. října 2018 19 / 27

Ř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? lecture03_10.cpp PB161 přednáška 3: kontejnery, iterátory, algoritmy 2. října 2018 20 / 27

Ř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 lecture03_10.cpp PB161 přednáška 3: kontejnery, iterátory, algoritmy 2. října 2018 21 / 27

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) lecture03_11.cpp PB161 přednáška 3: kontejnery, iterátory, algoritmy 2. října 2018 22 / 27

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 2. října 2018 23 / 27

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 (hlavičkový soubor <numeric>) 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 2. října 2018 24 / 27

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; }); lecture03_12.cpp, lecture03_13.cpp PB161 přednáška 3: kontejnery, iterátory, algoritmy 2. října 2018 25 / 27

Lambda funkce Syntax [zachytávání](parametry) -> návratový typ { 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í co se smí vynechat? návratový typ pak se dedukuje automaticky podle return parametry pak je bez parametrů, tj. totéž jako () PB161 přednáška 3: kontejnery, iterátory, algoritmy 2. října 2018 26 / 27

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