Standardní algoritmy v C++.



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

Vector datový kontejner v C++.

Funkční objekty v C++.

Standardní algoritmy vyhledávací.

Šablony, kontejnery a iterátory

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

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

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

Hotelová škola, Obchodní akademie a Střední průmyslová škola Teplice,Benešovo náměstí 1, příspěvková organizace

Prostory jmen. #include<iostream.h> namespace RadimuvProstor { int secti(int a, int b); class Trida { private: int Atribut; public: void metoda();

Šablony, kontejnery a iterátory

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

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

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

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++

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

Mělká a hluboká kopie

Programování v C++ První kroky

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

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

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

Abstraktní třídy, polymorfní struktury

Objektov orientované programování. C++ Akademie SH. 7. Objektov orientované programování. Michal Kvasni ka. Za áte níci C++ 2.

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

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

Vstupní a vstupní proudy v C++

Jazyk C# (seminář 5)

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

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

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

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

PROGRAMOVÁNÍ V C++ URČENO PRO VZDĚLÁVÁNÍ V AKREDITOVANÝCH STUDIJNÍCH PROGRAMECH ROSTISLAV FOJTÍK

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

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

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

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

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

Dynamická identifikace typů v C++.

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

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

Jazyk C++ I. Šablony 3

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

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

Syntaxe vyjímek. #include <iostream> #include <string> using namespace std; // Trida vyjimek class Vyjimka { private:

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

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

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

C++ objektově orientovaná nadstavba programovacího jazyka C

Pokročilé programování v jazyce C pro chemiky (C3220) Pokročilá témata jazyka C++

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

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

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

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

Zpracoval:

5 Rekurze a zásobník. Rekurzivní volání metody

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

Konstruktory a destruktory

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 4

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

1 Nejkratší cesta grafem

12. Automatické vyhodnocení derivací. jaro 2012

Objekty a třídy. Procedurální a objektově orientované programování. V této kapitole se naučíte: Procedurální a objektově orientované programování

Základy programování. Úloha: Eratosthenovo síto. Autor: Josef Hrabal Číslo: HRA0031 Datum: Předmět: ZAP

Jazyk C++ I. Šablony 2

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

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

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

Základy C++ I. Jan Hnilica Počítačové modelování 18

Jazyk C# a platforma.net

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

Prostory jmen. při vkládání několika hlavičkových souborů může vzniknout kolize. logika.h const int x=5; typedef struct {...

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

Přetěžování operátorů

C++ objektově orientovaná nadstavba programovacího jazyka C

Přetěžování operátorů

Datové typy pro reálná čísla

Digitální učební materiál

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

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

SYSTÉMOVÉ PROGRAMOVÁNÍ Cvičení č.1

Digitální učební materiál

Digitální učební materiál

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

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

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

V dalších letech se pak začaly objevovat první normy pro jazyk C++ (ISO/IEC 14882:1998; ISO/IEC 9899:1999; ISO/IEC 14882:2003; ISO/IEC 14882:2011).

Digitální učební materiál

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

Jazyk C++ I. Šablony

Predispozice pro výuku IKT (2015/2016)

Moderní programování objektových aplikací v C++ (ESF)

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. November 16, 2017

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

Programovanie

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

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

Transkript:

Standardní algoritmy v C++. Standardní algoritmy jsou součástí STL. Jedná se o spoustu užitečných šablon funkcí, které za nás naprogramoval někdo jiný. Na nás je jen, abychom je používali. Také si ukážeme příklady algoritmů pro naplnění kontejneru. Standardní algoritmy jsou šablony funkcí. Všechny šablony jsou deklarovány v hlavičkovém souboru algorithm v prostoru jmen std. Algoritmy ve většině případů slouží k práci s kontejnery. Žádný s algoritmů ale nepracuje s kontejnery přímo. K prvkům kontejneru přistupují algoritmy zásadně pomocí iterátorů. To umožňuje, aby algoritmy byly obecné a jednou napsaný algoritmus byl použitelný pro jakýkoliv kontejner. Díky toho lze algoritmy aplikovat také na obyčejné pole. S jistým typem algoritmů jsme se již setkali. Jednalo se o množinové operace pro průnik, sjednocení, množinový rozdíl, symetrickou diferenci a určení zda se jedná o podmnožinu. Těmito operacemi se dále nebudeme zabývat. Algoritmy nepracující s kontejnery Většina algoritmů je pro manipulaci s daty v kontejnerech. Jako příklad algoritmů, které s kontejnery nemanipulují uvedu algoritmy min, max, swap. Algoritmus swap "vymění" obsah obou prvků. Šablona swap má parametr udávající typ obou prvků. Parametrem funkce jsou dvě reference na proměnné, jejíž hodnoty chceme vyměnit. Typ, který je parametrem šablony musí být schopen se kopírovat pomocí kopírovacího konstruktoru a operátoru =. Nelze-li použít implicitní, musí je definovat programátor. Algoritmy min a max vracejí minimální a maximální prvek. Pro každý algoritmus existují dvě varianty: template <class T>const T& min(const T& a, const T& b); - parametrem šablony je typ obou prvků a typ návratové hodnoty. Algoritmus vrátí minimální prvek z a,b. Použije při tom operátor <. template <class T, class Compare>const T& min(const T& a, const T& b, Compare comp); -obdobně jako minulá možnost. K výběru minima nebude použit operátor <, ale funkční objekt zadaný jako poslední parametr. Viz přednáška funkčních objektů. Tím zajistíme, aby objekt a a objekt b byly porovnány pomocí jiné, námi vybrané relace.

Pro algoritmus max je situace obdobná. Použití min, max a swap je velmi jednoduché. #include <iostream> #include <algorithm> #include <functional> using namespace std; less<int> l; int main() int a = 9, b = 10, c = 11; cout << min(a,b) << endl; cout << max(b,c) << endl; swap(c,a); cout << min(a,b,l) << endl; Jenom ukázka možností. V tomto konkrétním pøípadì jsem chování min pomocí objektu l nijak nezmìnil. */ return 0; Algoritmy pro vyplňování kontejnerů V C++ existují 4 algoritmy, kterými lze vyplňovat kontejnery nějakými hodnotami. Pro vyplnění kontejneru konstantní hodnotou slouží algoritmy fill a fill_n. Šablona fill má 2 parametry. Typ iterátoru (očekává se dopřední iterátor. Viz můj článek Iterátory v C++). Druhým parametrem je typ vkládaného prvku. Parametry funkce jsou dva iterátory (začátek a konec) a prvek, který se má vložit mezi prvky dané iterátory začátek a konec. Šablona fill_n má 3 parametry. Typ iterátoru (očekává se výstupní iterátor), typ parametru udávající počet vložených prvků a typ vkládaného prvku. Parametry funkce jsou iterátor, udávající začátek, počet prvků a vkládaný prvek. Použití je jednoduché.

Ukážeme si jej na jednoduchém příkladu. #include<iostream> #include<fstream> #include<algorithm> #include<vector> using namespace std; int main() // konstrukce vektoru o 10ti prvcich, kazdy prvek je 3ka, konstrikce iteratoru vector<int> vektor(10,3); vector<int>::iterator i; // nastaveni vsech prvku na hodnotu 20 fill(vektor.begin(),vektor.end(),20); // Do prvku vektor[2] a 4 následujících (celkem 5) vloží èíslo 100. fill_n(vektor.begin() + 2,5,100); // take proudy maji sve iteratory. Zde zapisu do // textoveho souboru "Pokus.txt" deset nul oddelenych carkou. ofstream soubor("pokus.txt"); fill_n(ostream_iterator<int>(soubor,","),10,0); soubor << endl; return 0;

Výsledek: Pro vyplnění kontejneru nekonstantní hodnotou jsou k dispozici algoritmy generate a generate_n. Parametry jsou obdobné jako u fill, resp. fill_n jen s tím rozdílem, že místo parametru šablon udávající typ vkládaného prvku je parametrem třída funkčního objektu (generátoru). A jako parametr funkce místo hodnoty, která se má vkládat, je parametrem funkční objekt (generátor), nebo ukazatel na funkci. Očekává se ukazatel na funkci, která nemá parametry a vrací typ prvku v kontejneru, nebo funkční objekt jehož třída má přetížen operátor () tak, aby vracel typ prvku v kontejneru a neměl parametry. Viz. Přednáška funkčních objektů. Uveďme si příklad. #include<iostream> #include<fstream> #include<algorithm> #include<vector> #include<stdlib.h> using namespace std; class Faktorial private: int I, Vysledek; public: Faktorial() : I(0), Vysledek(1) int operator() () return Vysledek *=++I; N-ty prvek ve vektoru bude n! (n - faktorial). Upozornuji, ze prvek s indexem 0 je prvni, nikoliv nulty. */ ; class Rada private: int A,B; public: Rada() : A(0),B(1) // pokr.

// pokr. int operator() () swap(a,b); return A += B; Prvni dva prvky jsou jednicky, kazdy dalsi prvek je soucet predchozich dvou. Muze se to zdat trochu zvlastne napsane, ale pracuje to tak, jak ma. */ ; int main() vector<int> vektor(10); vektor má 10 prvku*/ vector<int>::iterator i; Faktorial f; Rada r; generate(vektor.begin(),vektor.end(),rand); Jako generator je ukazatel na funkci rand vracejici nahodne cislo. Vyplnil jsem vektor nahodnymi cisly. */ generate(vektor.begin(),vektor.end(),f); generate(vektor.begin(),vektor.end(),r); Nesmime zapomenout, ze vse lze pouzit i na pole. */ int pole[20]; generate_n(pole,20,r); for(int *p = pole; p!= &pole[20]; p++) cout << *p << '\t'; return 0;

Výsledek : Jako poslední parametr funkce generate je možné zadat ukazatel na funkci (v mém příkladě rand.), nebo funkční objekt (v mém příkladě objekt f třídy Faktorial, nebo objekt r třídy Rada.). Cvičení. Cv. 1. Napište program, který pomocí standardních algoritmů naplní nějaký 2 vektory a 2 pole stejného typu násobky dvou požadovaných čísel. Počet násobku bude vždy 20. program poskytne zadat čísla, jejichž násobky se vyplní ve vektoru a v poli. Po vyplnění se hodnoty zobrazí vektorů a polí zobrazí. Provede se pomocí standardního algoritmu výměna prvků mezi oběma vektory a poli a opět se vše zobrazí.