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++
Datové kontejnery v C++ - Úvod do STL
9. října 2001, 00.00 | Dnes se podíváme na datové kontejnéry z knihovny STL jazyka C++. Datový kontejnér je objekt, který je schopen "skladovat" jiné objekty. Ukážeme si rozdělení a vlastnosti kontejnérů. Na příkladu si ukážeme použití kontejnéru stack a bitset.
STL je zkratka slov Standard Template Library. Jedná se o standardní knihovnu šablon jazyka C++. Knihovna by měla být dodávána s každým překladačem C++. V STL můžeme najít mnoho různých a užitečných šablon. Mimo jiné zde jsou šablony datových kontejnerů, iterátory a šablony algoritmů, které pomocí iterátorů pracují s datovými kontejnery. Kompletní knihovnou STL se zabývat nebudeme. V několika článcích si uděláme něco jako přehled podstatných částí STL.
Datové kontejnery v C++Pod pojmem datový kontejner si představme něco, co má schopnost "zapamatovat si" nějaké data. Data jsou v kontejneru nějakým způsobem uloženy. kontejnery v STL se dělí na posloupnosti a asociativní kontejnery. Posloupnosti jsou logické posloupnosti dat, které ale nemusejí být v paměti fyzicky za sebou. Asociativní kontejnery jsou kontejnery, kde k datům přistupujeme pomocí nějakého klíče. Způsob uložení dat, přístupu k nim je dán typem kontejneru. V knihovně STL jsem jich napočítal celkem 11. Snad jsem na žádný nezapomněl. Přehled datových kontejnerů je v následující tabulce.
Posloupnost bitů pevné délky. | |||
Oboustranná fronta. Prvky lze vkládat, nebo odebírat z obou konců. Sice lze rovněž odebírat, nebo vkládat prvky na libovolné místo ve frontě (kontejner deque to umožňuje), ale tato operace není příliš efektivní. | |||
Oboustranně zřetězený seznam. | |||
Asociativní pole. pole, které nemusí být indexováno celočíselným typem, ale čímkoliv. Třeba řetězcem. Pro daný klíč může existovat pouze 1 asociovaná hodnota. Tomuto kontejneru se budeme v budoucnu zabývat v samostatném článku. | |||
Asociativní pole. Pro daný klíč (index) může existovat více asociovaných hodnot. Tomuto kontejneru se budeme v budoucnu zabývat v samostatném článku. | |||
Multimnožina. množina, ve které se mohou prvky opakovat. Tomuto kontejneru se budeme věnovat později v samostatném článku. | |||
Prioritní fronta. Fronta, ve které neplatí pravidlo "první dovnitř, první ven". Prvky, které se do fronty uloží jsou uspořádány podle nějaké relace. Dalo by se říci, že předbíhají ve frontě podle nějaké předem dané priority. | |||
Klasické fronta. platí pravidlo, že prvek, který byl jako první vložen do fronty, z ní bude také první vybrán. | |||
Množina. Daná hodnota může být v množině obsažena jen jednou. Tomuto kontejneru se budeme věnovat později v samostatném článku. | |||
Klasický zásobník. Platí pravidlo, že prvek, který byl vložen do zásobníku jako poslední bude vybrán jako první. | |||
Obdoba jednorozměrného pole. Tomuto kontejneru se budeme věnovat později v samostatném článku. |
Každý kontejner je šablona třídy. Parametrem této šablony je typ prvků, které mají být v kontejneru uloženy. Pole s libovolným intervalem indexování, které jsem předvedl v minulém článku byl vlastně takový pokus o napsání vlastního datového kontejneru. Každý kontejner v STL obsahuje následující veřejné typy. "Typ" je zde parametr šablony, tedy typ prvků, které jsou v kontejneru uloženy.
value_type, což je přejmenování (pomocí typedef) typu Typ.
reference, což je přejmenování (pomocí typedef) typu Typ&.
const_reference, což je přejmenování typu const Typ&.
iterator, což je typ iterátor na prvky daného kontejneru. Iterátorům se budeme věnovat později.
const_iterator
size_type, což je přejmenování typu size_t.
difference_type, což je přejmenování typu ptrdiff_t.
Dále každý kontejner má přetížené operátory = == !- < >, má k dispozici bezparametrický a kopírovací konstruktor. Nemusíme se tedy ničeho bát, a klidně jakkoliv kontejner kopírovat, nebo porovnávat. Dále každý kontejner má následující veřejné metody:
begin - touto metodou se budeme podrobně zabývat až ve článku o iterátorech.
empty - vrací true, jestliže je kontejner prázdný.
end - touto metodou se budeme podrobně zabývat až ve článku o iterátorech.
max_size - vrací maximální možnou velikost kontejneru.
size - vrací aktuální velikost kontejneru.
swap - zajistí výměnu prvků s jiným kontejnerem.
Další metody se v různých kontejnerech liší.
U typu, který má být parametrem kontejneru, musíme počítat s tím, že jeho instance budou kopírovány pomocí kopírovacího konstruktoru, případně pomocí operátoru =. U některých kontejnerů, mohou být prvky také porovnávány pomocí relačních operátorů. Proto nemohou-li být použity implicitní operátory je nutné je přetížit.
Dále je nutno upozornit, že všechny kontejnery (Nejen kontejnery, v podstatě vše z STL.) jsou deklarovány v prostoru jmen std.
Chce-li někdo proniknout do "tajů" kontejnerů, může si podrobně prostudovat hlavičkové soubory, ve kterých jsou deklarovány. Je v nich k dispozici úplný zdrojový text šablon. Rovněž se můžete podívat na můj velice jednoduchý ukázkový kontejner array z minulého článku.
Tolik tedy k přehledu o datových kontejnerech z STL jazyka C++. Některými kontejnery se budeme věnovat v samostatných článcích, dnes si letmo jen pro názornou ukázku ukážeme práci s dalšími kontejnery.
Musím ještě pro úplnost upozornit na tak zvané adaptéry. Některé kontejnery, které jsem zde uvedl, nejsou vlastně "skladiště dat". Jsou to třídy, které zapouzdří nějaký jiný kontejner a přizpůsobí (adoptují - adaptéry) ho jiným požadavkům. Například adaptér je stack, který jako svůj druhý parametr šablony vyžaduje nějaký kontejner. Implicitní hodnota tohoto parametru je deque. Adaptér kontejneru poznáme tak, že je u něj možnost jako další parametr šablony zadat jiný kontejner.
A nyní již jednoduchý příklad. Vytvoříme zásobník čísel int. Nějaké čísla do něj vložíme, a potom zase vybereme.
|
Kdybychom z nějakých důvodů nechtěli mít jako zásobník (stack) adoptovánu deque, ale například vector, potom by řádek definice objektu zásobník vypadal takto:std::stack<int,std::vector<int> >.
Dalším příkladem bude bitset, tedy posloupnost bitů. Tento kontejner má oproti všem ostatním jednu zvláštnost. Parametrem šablony není typ, ale počet bitů, které budou v kontejneru uloženy. Podívejme se na jednoduchý příklad.
|
Tolik tedy pro úvod ke kontejnerům. V následujících článcích se budu některými kontejnery zabývat podrobněji. Nebudu zde ale uvádět výčet všech metod kontejnerů. Bylo by to naprosto zbytečné. Pro tyto účely slouží dokumentace ke knihovně. Jedna podle mého názoru pěkná dokumentace je na adrese http://www.sgi.com/tech/stl/stl_index_cat.html. Příště se podrobně budeme zabývat kontejnerem vector, což je jednorozměrné pole. V dalších článcích potom asociativním polem, a množinou.
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