Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
C/C++
Skenovací (prohlížecí) algoritmy v C++
1. února 2002, 00.00 | Dnes si ukážeme, že v C++ existuje for_each. Algoritmus, který pro zadaný kontejner, nebo jeho část provede určenou činnost. Pro každý prvek zavolá funkci, nebo operátor () funkčního objektu. Dále si také povíme o algoritmech count, count_if, accumulate.
Skenovací algoritmy jsou algoritmy, které prohlédnou kontejner prvek po prvku, a po každé provedou nějakou operaci. Mezi tyto algoritmy patří: accumulate a for_each. Také by se do této skupiny mohl zařadit algoritmus count, resp. count_if. Deklarace jsou:
- template <class InputIterator, class Typ, class TypVysledek> void count(InputIterator zacatek, InputIterator konec, const Typ &hodnota, TypVysledek &n); - Parametry šablony jsou 3. První udává typ iterátoru, druhý udává typ prvků v kontejneru a poslední je typ výsledku. Jako typ výsledku bude asi v 99% použit nějaký celočíselný typ. Není to ale podmínkou. Důležité pouze je, aby typ výsledku měl k dispozici operátor ++. Parametry funkce jsou iterátory udávající začátek a konec oblasti. Dále následuje hledaná hodnota a proměnná pro výsledek. Po každé, co je mezi prvky danými iterátory začátek a konec nalezena hledaná hodnota (Použije se operátor == implicitní, nebo přetížený.), bude zvýšena hodnota výsledku (V našem případě n) pomocí operátoru++.
- template <class InputIterator, class TPodminka, class TypVysledek> void count(InputIterator zacatek, InputIterator konec, const TPodminka podminka, TypVysledek &n); - Obdobně jako minule. S rozdílem, že nyní nebude hledána konkrétní hodnota, ale hodnoty, které vyhovují zadané podmínce.
- template <class InputIterator, class Typ> Typ accumulate (InputIterator zacatek, InputIterator konec, Typ pocatecniHodnota); - Parametry šablony jsou typ iterátoru a typ prvků v kontejneru. Parametry funkce jsou iterátory udávající začátek a konec kontejneru. Dále počáteční hodnota výsledku. Funkce vrací součet všech prvků. Použije operátor +, který je buď implicitní, nebo přetížený. Algoritmus vlastně sečte počáteční hodnotu a všechny prvky v kontejneru. Zadáte-li jako počáteční hodnotu 0 (Což uděláte asi v 99%), vrátí funkce sumu prvků v oblasti dané iterátory začátek a konec.
- template <class InputIterator, class Typ, class BinaryOperation operace> Typ accumulate (InputIterator zacatek, InputIterator konec, Typ pocatecniHodnota, BinaryOperation operace); - Obdobně jako předchozí. Rozdíl je v tom, že tato varianta accumulate nebude sčítat, ale provede binární operaci zadanou programátorem.
U algoritmu accumulate musím upozornit, že jeho deklarace se nenachází v hlavičkovém souboru algorithm, ale v numeric. Vše si ukážeme na jednoduchém příkladu. Úmyslně zde střídám pole s vektorem (kontejnerem), aby bylo zřejmé, že algoritmy lze použít i na obyčejné pole.
|
Algoritmus for_each v C++
Často jsem se setkal s mylným tvrzením, že v C++ neexistuje for_each, nebo nějaká jeho obdoba.
Hlavně velmi často v článcích (tištěných i na internetu) o jiných programovacích jazycích autoři srovnávají daný jazyk s C++. Vždy při tom prohlásí, že jednou z nevýhod C++ oproti
jazyku, o kterém píšou, je absence for_each. Snad se mi podaří tuto nepravdu vyvrátit. Algoritmus for_each
provede pro všechny prvky v zadaném rozmezí nějakou zadanou operaci. Deklarace:
template
|
Určitě je dobré si pro procvičení tento příklad rozšířit. Pomocí znalostí, které již máme s tohoto a předchozích článků můžeme například zjistit kolik bodů je ve kterém kvadrantu. Vyhledat body v daném kvadrantu, nebo v dané oblasti, atd... Všem, kteří nemají příliš zkušenosti s používáním standardních algoritmů toto doporučuji jako cvičení. Konečně nemáme v kontejneru int, char, nebo jiné primitivní datové typy.
Funkce, nebo operátor () funkčního objektu mohou ve svém těle volat i nekonstantní metody. V mém příkladě volám metody nastavX a nastavY.
Pomocí for_each tedy lze měnit prvky v kontejneru. Někdy by bylo ale lepší, kdyby algoritmus na základě svého argumentu vytvořil nový objekt (přetransformoval parametr), který by byl vložen do kontejneru místo původního. Takový algoritmus v C++ existuje. Jmenuje se transform. Transformačních algoritmů je v C++ více. Budeme se jim věnovat v příštím článku.
Obsah seriálu (více o seriálu):
- Základy OOP v C++: Od C k C++
- Základní pojmy objektově orientovaného programování
- Vytváření tříd, instance třídy, zasílání zpráv v C++
- Vytváření instancí - konstruktory, destruktory
- Kopírovací konstruktor v C++
- Jednoduchá dědičnost v C++
- Časná versus pozdní vazba - úvod do polymorfismu v C++
- Polymorfismus - dokončení
- Vícenásobná dědičnost v C++
- Vícenásobná dědičnost v C++ - opakovaná dědičnost
- Vícenásobná dědičnost v C++ - volání konstruktorů a destruktorů
- Přetěžování operátorů v C++ 1.díl
- Přetěžování operátorů v C++ 2. díl
- Vstupní a výstupní operace pomocí datových proudů v C++
- Přetěžování operátorů << a >> pro datové proudy v C++
- Neformátovaný vstup a výstup v C++
- Paměťové proudy v C++
- Prostory jmen v C++
- Řetězce v C++
- Výjimky v C++
- Výjimky v C++ - výjimky tvoří dědičnou hierarchii
- Výjimky v C++ - dokončení
- Dynamická identifikace typů v C++
- Přetypování v C++
- Problémy s typy při vícenásobné dědičnosti
- Šablony funkcí v C++
- Šablony datových typů v C++
- Vnitřní typy u parametrů šablon, vnořené šablony v C++
- Pole s libovolným intervalem indexování v C++
- Datové kontejnery v C++ - Úvod do STL
- Vector - datový kontejner v C++
- Iterátory v C++
- Šablona vector v C++ a iterátory
- Asociativní pole v C++
- Množina v C++
- Funkční objekty v C++
- Standardní funkční objekty v C++
- Úvod do standardních algoritmů v C++
- Kopírovací a přesouvací algoritmy v C++
- Vyhledávací algoritmy v C++
- Skenovací (prohlížecí) algoritmy v C++
- Transformační algoritmy v C++
- Řadící algoritmy v C++
- Halda v C++
- Standardní algoritmy v C++ - dokončení
- Automatické ukazatele v C++
- Inteligentní ukazatel - čítač referencí v C++
- Použití čítače referencí v C++
- Kopírování velkých objektů v C++
- Řízené kopírování prvků v poli v C++
- Dokončení seriálu objektově orientované programování v C++
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007