Seznamy hodnot podrobněji
C++ 11

image_printTisk

V tomto článku se blíže seznámíme se seznamy hodnot. Máme na výběr dva typy seznamů. Seznam s pevným počtem položek nebo seznam s proměnlivým počtem položek.

Seznam s pevným počtem položek

Seznam s pevným počtem položek se definuje pomocí datového typu knihovny STL array. Viz následující příklad:

#include <array>

array<int, 10> pole;

Na příkladu je vidět vložení hlavičkového souboru array a definice seznamu hodnot o velikosti 10 položek s datovým typem položky int. 

Nyní si na dalším příkladu ukažme práci s tímto seznamem hodnot:

Chyba při načítání zdrojového kódu.

Na příkladu je vidět deklarace proměnné s názvem pole, což se seznam hodnot typu int s počtem položek deset. Po té je toto pole vyplněno hodnotami, kdy se ke konkrétní položce seznam přistupuje pomocí operátoru indexování, reprezentovaného hranatými závorkami, které obsahují index položky s počátkem číslování od nuly. Nakonec přes range-for cyklus je obsah pole vypsán na výstup.

Nyní si ještě ukážeme druhý příklad, kde datovým typem bude struktura:

Chyba při načítání zdrojového kódu.

Na příkladu je vidět definice struktury Pozice. Po té se nachází funkce printPozice, která vypíše obsah jedné této struktury na standardní výstup. Dále pak následuje už vlastní funkce main, kde po deklaraci pole se nachází vyplnění hodnot příslušných struktur v poli. Je zde krásně vidět, že napřed musí být aplikován operátor indexování na pole a po té se přistupuje až ke konkrétnímu atributu struktury pomocí znaku tečka. Následně je vypsán obsah pole opět pomocí range-for cyklus na výstup voláním metody printPozice.

Seznam s proměnlivým počtem položek

Pro seznamy hodnot s počtem položek, který dopředu neznáme, je lepší použít třídu vector knihovny STL. Deklarace je podobná jako u array s tím rozdílem, že neuvádíme počet položek. Je uveden jen datový typ položky tohoto seznamu. Viz následující ukázka:

#include <vector>
using namespace std;

vector<int> pole;

Na příkladu je vidět, že napřed musíme vložit hlavičkový soubor vector knihovny STL. Potom již známá deklarace “using namespace std”, jejíž plné porozumění najdete na konci úvodní kapitoly o základech C++. Nakonec je uveden název datového typu vector, uvnitř znaků ‘<‘ a ‘>’ je uveden datový typ položky seznamu, v našem případě int. Nakonec se uvádí název proměnné, na příkladu je to název pole. Deklarace je samozřejmě ukončena středníkem.

Datový typ vector je v podstatě třídou, která nabízí pár funkcí, které nám usnadňují práci s tímto seznamem hodnot. Napřed uveďme příklad:

Chyba při načítání zdrojového kódu.

První je ve funkci main deklarováno pole s seznamem typu vector<int>. Potom vyplníme toto pole hodnotami a k tomu použijeme metody push_back(), která vkládá hodnotu na konec pole. Nakonec provedeme výpis pole na standardní výstup. V cyklu for je použito volání metody size(), která vrací počet položek v seznamu a konkrétní hodnotu získáváme pomocí indexovacího operátoru, vyjádřeného hranatými závorkami s uvedením indexu položky uvnitř. Index položky v hranatých závorkách se počítá od počátečního indexu s číslem 0, jinak řečeno, index první položky seznamu má index s číslem 0.

Na druhém příkladu si představíme další dvě užitečné metody pro práci s datovým typem vector. Příklad vypíše hodnoty prvotně vložené do něj v opačném pořadí na standardní výstup.

Chyba při načítání zdrojového kódu.

První část příkladu s inicializací pole hodnot je totožná s předchozím příkladem, tak již není důvod jej popisovat znovu. Blíže se podíváme na popis, jak funguje výpis hodnot seznamu na standardní výstup. V cyklu while se testuje logickou negací podmínka o tom, zda není pole prázdné. K tomu je použito volání metody empty(), která vrací hodnotu true, pokud je pole prázdné. Následně uvnitř cyklu je prvním příkazem vypsán poslední prvek pole na standardní výstup. K získání posledního prvku pole je použito volání metody back(). Druhým a posledním příkazem cyklu je volání metody pop_back(), které odstraní poslední prvek ze seznamu.

Nakonec se zmíníme ještě o metodě clear(), která, jak název napovídá, odstraní ze seznamu všechny položky a tím pádem bude příslušný seznam prázdný.

Kdy použít vector a kdy array

V drtivě většině případu je doporučováno použití seznamu datového typu vector. Pokud potřebujeme zpracovat položky do cca. desítek až stovek záznamů, je tato datová struktura nejlepší, a to i z důvodu, že jsou data automaticky uchovávána na dynamické paměti. Navíc velikost počtu dat vector může automaticky měnit. Je možné i u tohoto datového typu rezervovat určité místo pro příjem většího množství položek, aby nedocházelo k neustále realokaci paměti na dynamické haldě. O tom ale bude zmínka až ve třetí kapitole pojednávající o STL více do hloubky.

Datový typ array má smysl pouze v případě, kdy přesně známe počet položek. Dále může být i jeho použití nebezpečné, protože nealokuje svůj paměťový prostor automaticky na dynamické paměti, ale v místě platnosti, kde je deklarován. Tzn., že pokud array deklarujeme s velkým počtem položek uvnitř funkce, bude alokován obsah na zásobníku, což může vést k jeho přetečení a pádu aplikace. Smysl použití této struktury má v případě zpracování velkého množství binárních dat s alokací na haldě a za použití chytrého ukazatele, pojednává o nich hned další článek. Může sloužit třeba jako takový buffer pro zpracování dokumentů apod., z důvodu, že konkrétní implementace C++ může použít různé optimalizace ke zvýšení výkonu práce než u datového typu vector. Tyto optimalizace už jsou ale závislé na konkrétním překladači, implementaci knihovny STL, apod.

image_printTisk
Seznamy hodnot podrobněji
C++ 11
Ohodnoťte tento článek

Související články

  • Chytré ukazatele Často potřebujeme alokovat, či jinak řečeno si rezervovat, paměť na dynamické části paměti, jelikož neznáme potřebnou délku v době kompilace programu, ale až za jeho běhu. Například […]
  • Organizace dat v paměti RAM Tento článek poskytuje teoretický úvod do způsobu uspořádání paměti aplikace. Seznámíme se s jednotlivými bloky paměti a jejich významem a dále bude výklad stručně doplněn o téma […]
  • Strukturované datové typy Při psaní jakéhokoliv programu si nevystačíme často jen v čísly a texty. Potřebujeme třeba si například definovat náš vlastní datový Zákazník, který bude reprezentovat nějaký pojem v […]
  • Logické operátory Tématem tohoto článku jsou logické operátory, které slouží ke skládání jednoduchých výrazů, i jejich složitějších variant, s aplikovaným relačním operátorem do logických podmínek. Budeme […]
  • Metody vracení hodnot z funkce DO POKROČILÝCH ASI Tento článek pojednává o způsobech vracení hodnot z funkcí. Jsou to stejné způsoby, o kterých je psáno ve článku předchozím, tedy vracení hodnotou nebo vracení […]
  • Ukazatele na pole V tomto článku si probereme ukazatele na pole. Seznámíme se nejen s ukazateli na pole jednorozměrné, ale i na složitější případ, tedy pole vícerozměrná. Vše si zase samozřejmě uvedeme na […]