36
Kni Kni žnice STL žnice STL (Standard Template (Standard Template Library) Library)

Kni žnice STL (Standard Template Library)

  • Upload
    emilia

  • View
    114

  • Download
    7

Embed Size (px)

DESCRIPTION

Kni žnice STL (Standard Template Library). Osnova prednášky. Knižnice STL Dátové štruktúry STL Algoritmy STL Iterátory Vektory Znakové reťazce. Standard Template Library. STL (Standard Template Library) je súbor štandardných knižníc, ktoré umožňujú prácu s rôznymi dátovými štruktúrami. - PowerPoint PPT Presentation

Citation preview

Page 1: Kni žnice STL (Standard Template Library)

KniKnižnice STLžnice STL(Standard Template Library)(Standard Template Library)

Page 2: Kni žnice STL (Standard Template Library)

Osnova prednáškyOsnova prednášky

Knižnice STLKnižnice STL Dátové štruktúry STLDátové štruktúry STL Algoritmy STLAlgoritmy STL IterátoryIterátory VektoryVektory Znakové reťazceZnakové reťazce

Page 3: Kni žnice STL (Standard Template Library)

Standard Template LibraryStandard Template Library STL (Standard Template Library) je súbor štandardných je súbor štandardných

knižníc, ktoré umožňujú prácu s rôznymi dátovými štruktúrami.knižníc, ktoré umožňujú prácu s rôznymi dátovými štruktúrami.

Jadrom STL sú tri základné prvky:Jadrom STL sú tri základné prvky:

1. 1. Dátové štruktúry – STL umožňuje používať viaceré bežné typy – STL umožňuje používať viaceré bežné typy dátových štruktúr. Definícia týchto štruktúr je obsahom väčšiny dátových štruktúr. Definícia týchto štruktúr je obsahom väčšiny knižníc STL. Ide vlastne o rôzne typy generických tried. Okrem knižníc STL. Ide vlastne o rôzne typy generických tried. Okrem uchovávania dát majú triedy zabezpečenú aj základnú funkčnosť, uchovávania dát majú triedy zabezpečenú aj základnú funkčnosť, napr. vrátenie veľkosti štruktúry, konkrétnej hodnoty, prvej a napr. vrátenie veľkosti štruktúry, konkrétnej hodnoty, prvej a poslednej hodnoty, pridanie a poslednej hodnoty, pridanie a vymazanievymazanie hodnoty a podobne. hodnoty a podobne.

2. 2. Algoritmy – v knižniciach STL sú definované aj algoritmy, ktoré – v knižniciach STL sú definované aj algoritmy, ktoré dokážu napr. triediť dáta, vyhľadávať v nich, rôzne ich meniť a dokážu napr. triediť dáta, vyhľadávať v nich, rôzne ich meniť a podobne.podobne.

3. 3. Iterátory – iterátory sú objekty, ktoré sú v podstate – iterátory sú objekty, ktoré sú v podstate obohatenými smerníkmi. Ich úlohou je umožňovať prístup k obohatenými smerníkmi. Ich úlohou je umožňovať prístup k jednotlivým prvkom štruktúr.jednotlivým prvkom štruktúr.

Page 4: Kni žnice STL (Standard Template Library)

Dátové štruktúry STLDátové štruktúry STL 1. Vektor (knižnica <vector>)

Je to najuniverzálnejšia dátová štruktúra. Ide vlastne o Je to najuniverzálnejšia dátová štruktúra. Ide vlastne o dynamické pole, , ktoré môže obsahovať prvky ľubovoľného typu. ktoré môže obsahovať prvky ľubovoľného typu. Rozmery poľa sa môžu meniť podľa potreby, teda kedykoľvek, aj po počiatočnej alokácii. , teda kedykoľvek, aj po počiatočnej alokácii. Prístup k prvkom vektora je rovnaký ako k prvkom štandardného poľa.Prístup k prvkom vektora je rovnaký ako k prvkom štandardného poľa.Použitie: Kedykoľvek, ak chceme použiť štandardné dynamické pole: Kedykoľvek, ak chceme použiť štandardné dynamické poleVýhody: Rýchly náhodný prístup k prvkom: Rýchly náhodný prístup k prvkomNevýhody: Pomalé vkladanie a vymazávanie: Pomalé vkladanie a vymazávanie

Page 5: Kni žnice STL (Standard Template Library)

Dátové štruktúryDátové štruktúry 2. Obojstranná fronta (knižnica <deque>)

Táto štruktúra sa podobá na vektor, je to teda dynamické pole. Táto štruktúra sa podobá na vektor, je to teda dynamické pole. Rozdiel je najmä vo vkladaní prvkov. Do vektora sa nové prvky Rozdiel je najmä vo vkladaní prvkov. Do vektora sa nové prvky pridávajú len na koniec a ak by sme chceli vložiť prvok inde, musíme pridávajú len na koniec a ak by sme chceli vložiť prvok inde, musíme celý zvyšok poľa posúvať. celý zvyšok poľa posúvať. Do obojstrannej fronty môžeme prvky pridávať aj na začiatok, bez toho, aby sa celé pole posúvalo. Ďalšie , bez toho, aby sa celé pole posúvalo. Ďalšie rozdiely sú v spôsobe alokácie a dealokácie pamäte.rozdiely sú v spôsobe alokácie a dealokácie pamäte.Použitie: Ak potrebujeme použiť dynamické pole, pričom budeme : Ak potrebujeme použiť dynamické pole, pričom budeme veľakrát vkladať (alebo vyberať) prvky, najmä na koniec a na veľakrát vkladať (alebo vyberať) prvky, najmä na koniec a na začiatok.začiatok.Výhody: Rýchle vkladanie na začiatok, rýchly náhodný prístup: Rýchle vkladanie na začiatok, rýchly náhodný prístupNevýhody: Pomalé vkladanie a mazanie vo vnútri, časovo : Pomalé vkladanie a mazanie vo vnútri, časovo náročnejšia dealokácia ako pri vektorenáročnejšia dealokácia ako pri vektore

Page 6: Kni žnice STL (Standard Template Library)

Dátové štruktúry STLDátové štruktúry STL 3. Zoznam (knižnica <list>)

Tu ide o dátovú štruktúru, kde Tu ide o dátovú štruktúru, kde každý prvok okrem hodnoty obsahuje aj smerník na nasledujúci a predchádzajúci prvok. Prvky sú takto . Prvky sú takto navzájom previazané, a ku konkrétnemu prvku sa môžeme dostať len navzájom previazané, a ku konkrétnemu prvku sa môžeme dostať len postupne od začiatku alebo od konca. Nie je možný priamy náhodný postupne od začiatku alebo od konca. Nie je možný priamy náhodný prístup k prvkom.prístup k prvkom.Použitie: Ak nepotrebujeme k prvkom pristupovať náhodne, ale skôr : Ak nepotrebujeme k prvkom pristupovať náhodne, ale skôr je dôležité ich poradie, ak vždy spracovávame všetky a ak je dôležité ich poradie, ak vždy spracovávame všetky a ak potrebujeme rýchlo vkladať alebo mazať.potrebujeme rýchlo vkladať alebo mazať.Výhody: Rýchle vkladanie a mazanie: Rýchle vkladanie a mazanieNevýhody: Pomalý náhodný prístup: Pomalý náhodný prístup

ZZ PP NN PP NN PP NN PP NN KK

PP NN PP NN

PP NN

PP NN PP NN PP NN

Page 7: Kni žnice STL (Standard Template Library)

Dátové štruktúry STLDátové štruktúry STL 4. Fronta (knižnica <queue>)

Fronta je dátová štruktúra typu FIFO (first in, first out). To znamená, že pridávať sa dá len na koniec a odoberať len zo začiatku. Nie je možný priamy náhodný prístup k prvkom. Nie je možný priamy náhodný prístup k prvkom.Použitie: V prípade, keď potrebujeme postupne spracovávať dáta, : V prípade, keď potrebujeme postupne spracovávať dáta, ktoré „čakajúktoré „čakajú” ” na spracovanie v rade. na spracovanie v rade. Výhody: Jednoduchá štruktúra: Jednoduchá štruktúraNevýhody: Obmedzená funkčnosť: Obmedzená funkčnosť

Page 8: Kni žnice STL (Standard Template Library)

Dátové štruktúry STLDátové štruktúry STL 5. Zásobník (knižnica <stack>)

Zásobník je štruktúra typu LIFO (last in, first out). Teda pridávať sa dá len na koniec a odoberať takisto len z konca. Nie je možný . Nie je možný priamy náhodný prístup k prvkom.priamy náhodný prístup k prvkom.Použitie: Ak potrebujeme odkladať dáta, zatiaľ čo robíme niečo : Ak potrebujeme odkladať dáta, zatiaľ čo robíme niečo iné, a po ukončení tejto činnosti ich chceme spracovávať, pričom iné, a po ukončení tejto činnosti ich chceme spracovávať, pričom môžeme začať aj posledným uloženým.môžeme začať aj posledným uloženým.Výhody: Jednoduchá štruktúra: Jednoduchá štruktúraNevýhody: Obmedzená funkčnosť: Obmedzená funkčnosť

Page 9: Kni žnice STL (Standard Template Library)

Dátové štruktúry STLDátové štruktúry STL 6. Množina (knižnica <set>)

Množina je usporiadaná dátová štruktúra, ktorá vylučuje duplicitu prvkov. To znamená, že hodnoty sú usporiadané podľa nejakého . To znamená, že hodnoty sú usporiadané podľa nejakého pravidla, ktoré je možné definovať, a žiadna hodnota sa v pravidla, ktoré je možné definovať, a žiadna hodnota sa v štruktúre nevyskytuje dvakrát. Podobne ako zásobník alebo fronta, štruktúre nevyskytuje dvakrát. Podobne ako zásobník alebo fronta, ani množina neumožňuje priamy náhodný prístup k prvkom. Pri ani množina neumožňuje priamy náhodný prístup k prvkom. Pri vkladaní sa prvok automaticky zaradí na správne miesto. Ak by vkladaní sa prvok automaticky zaradí na správne miesto. Ak by sme sa pokúšali vložiť hodnotu, ktorá sa už v množine nachádza, sme sa pokúšali vložiť hodnotu, ktorá sa už v množine nachádza, nepodarí sa nám to.nepodarí sa nám to.Použitie: Ak potrebujeme usporiadané hodnoty s vylúčením : Ak potrebujeme usporiadané hodnoty s vylúčením duplicityduplicityVýhody: Automatické usporiadanie, vylúčenie duplicity: Automatické usporiadanie, vylúčenie duplicityNevýhody: Nemožnosť náhodného prístupu: Nemožnosť náhodného prístupu11 33 66 77 99 1010 1212 1818

88

Page 10: Kni žnice STL (Standard Template Library)

Dátové štruktúry STLDátové štruktúry STL 7. Multimnožina (knižnica <set>)

Multimnožina je množina, ktorá umožňuje duplicitu. Takisto ako . Takisto ako množina má svoje prvky usporiadané podľa nejakého pravidla. množina má svoje prvky usporiadané podľa nejakého pravidla. Použitie, výhody a nevýhody sú podobné ako pri množinách.Použitie, výhody a nevýhody sú podobné ako pri množinách.

8. Prioritná fronta (knižnica <queue>)

PrioritnPrioritná fronta je založená na rovnakom princípe ako fronta, s á fronta je založená na rovnakom princípe ako fronta, s tým rozdielom, že tým rozdielom, že nevyberáme prvok, ktorý je na rade podľa poradia, ale prvok s najväčšou prioritou. Priorita je prideľovaná pri . Priorita je prideľovaná pri vložení prvku.vložení prvku.Použitie: Ak potrebujeme spracovávať dáta podľa priority.: Ak potrebujeme spracovávať dáta podľa priority.

11 22334455

Page 11: Kni žnice STL (Standard Template Library)

DDátové štruktúry STLátové štruktúry STL 9. Mapa (knižnica <map>)

Mapa je ďalší ďalší utriedený dátový typ, ktorý však namiesto samotných prvkov ukladá dvojice prvkov – tzv. – tzv. kľúč a samotnú a samotnú hodnotu prvku (napr. poradové číslo a k nemu prislúchajúce meno, hodnotu prvku (napr. poradové číslo a k nemu prislúchajúce meno, meno a k nemu patriace telefónne číslo, reálne číslo a jeho meno a k nemu patriace telefónne číslo, reálne číslo a jeho funkčná hodnota atď.). Dvojice v mape sú utriedené podľa kľúča, funkčná hodnota atď.). Dvojice v mape sú utriedené podľa kľúča, triediace kritérium sa dá definovať. Pri vkladaní sa nový prvok triediace kritérium sa dá definovať. Pri vkladaní sa nový prvok automaticky zaradí na správne miesto. automaticky zaradí na správne miesto. Mapa nepovoľuje duplicitu kľúčov, hodnoty sa môžu opakovať..Použitie: Kedykoľvek potrebujeme uchovať dvojice prvkov, : Kedykoľvek potrebujeme uchovať dvojice prvkov, zoradené podľa nejakého kritéria.zoradené podľa nejakého kritéria.Výhody: Automatické zoradenie hodnôt podľa kľúča, uchovávanie : Automatické zoradenie hodnôt podľa kľúča, uchovávanie dvojíc, zabraňovanie nejednoznačnosti kľúčovdvojíc, zabraňovanie nejednoznačnosti kľúčovNevýhody: Nemožnosť náhodného prístupu: Nemožnosť náhodného prístupu

Adamdam Braňoraňo Ivanavana Lenkaenka Tomášomáš

Page 12: Kni žnice STL (Standard Template Library)

Dátové štruktúry STLDátové štruktúry STL 10. Multimapa (knižnica <map>)

Multimapa je mapa, ktorá umožňuje aj duplicitu kľúčov..

11. Bitová množina (knižnica <bitset>)Bitová množina je štruktúra, ktorá umožňuje uchovávať hodnoty 0 a 1. Je to v podstate vektor, ale s tým rozdielom, že jeho veľkosť . Je to v podstate vektor, ale s tým rozdielom, že jeho veľkosť musí byť daná už pri vytváraní a potom sa už nemôže meniť.musí byť daná už pri vytváraní a potom sa už nemôže meniť.Použitie: Ak potrebujeme uchovávať vopred známy počet hodnôt 0 : Ak potrebujeme uchovávať vopred známy počet hodnôt 0 a 1a 1Výhody: Rýchly náhodný prístup: Rýchly náhodný prístupNevýhody: Pevná dĺžka: Pevná dĺžka

Adamdam Braňoraňo Ivanavana Lenkaenka TomášomášBraňoraňo

Page 13: Kni žnice STL (Standard Template Library)

Dátové štruktúry STLDátové štruktúry STL 12. Znakový reťazec (knižnica <string>)

Trieda string slúži na uchovávanie reťazca znakov. Nie je . Nie je šablónou, ide vždy o znakové pole, je však odvodená od šablónou, ide vždy o znakové pole, je však odvodená od všeobecnejšej generickej triedy.všeobecnejšej generickej triedy.

Na rozdiel od jednoduchého znakového poľa, Na rozdiel od jednoduchého znakového poľa, na triedu string môžeme uplatňovať operátory priradenia, sčítania, porovnávania priradenia, sčítania, porovnávania atď., čo bol vlastne dôvod, prečo bola táto trieda zavedená.atď., čo bol vlastne dôvod, prečo bola táto trieda zavedená.Ďalším rozdielom je aj väčšia bezpečnosť, keďže C ani C++ , keďže C ani C++ nemajú kontrolu prekročenia hraníc poľa. Trieda string bráni nemajú kontrolu prekročenia hraníc poľa. Trieda string bráni vzniku chýb, ktoré by vznikli z tohto dôvodu.vzniku chýb, ktoré by vznikli z tohto dôvodu.

SS TT RR II NN GG JJ EE SS KK VV EE LL ÝÝ

Page 14: Kni žnice STL (Standard Template Library)

Algoritmy STLAlgoritmy STL Súčasťou STL je aj Súčasťou STL je aj knižnica <algorithm>, ktor, ktorá obsahuje rôzne á obsahuje rôzne

algoritmy na prácu s dátovými štruktúrami. algoritmy na prácu s dátovými štruktúrami. Všetky algoritmy sú generické funkcie, fungujú teda pre všetky typy dátových štruktúr, , fungujú teda pre všetky typy dátových štruktúr, pre ktoré majú zmysel.pre ktoré majú zmysel.

V knižnici <algorithm> je okolo 70 algoritmov, napríklad::Hľadanie maxima a minimaHľadanie maxima a minimaHľadanie konkrétnej hodnoty v štruktúreHľadanie konkrétnej hodnoty v štruktúreTriedenieTriedenieZisťovanie rozsahu štruktúryZisťovanie rozsahu štruktúryVkladanie a odstraňovanie prvkovVkladanie a odstraňovanie prvkovAplikovanie funkcie na prvkyAplikovanie funkcie na prvkyHľadanie prieniku a rozdieluHľadanie prieniku a rozdieluOdstraňovanie duplicítOdstraňovanie duplicítZmena hodnôt vybraných prvkovZmena hodnôt vybraných prvkovVýmeny prvkovVýmeny prvkov......

Page 15: Kni žnice STL (Standard Template Library)

Iterátory Iterátory Ako sme si už hovorili, Ako sme si už hovorili, iterátory sú objekty, ktoré sú rozšírenými

smerníkmi na prvky dátových štruktúr. Sú to teda objekty, ktoré v . Sú to teda objekty, ktoré v sebe obsahujú smerník na prvok nejakého typu a k tomu ďalšie sebe obsahujú smerník na prvok nejakého typu a k tomu ďalšie dáta a metódy (informáciu o type iterátora, preťažené operátory dáta a metódy (informáciu o type iterátora, preťažené operátory atď.)atď.)

Iterátory slúžia na prístup k prvkom štruktúry. Používajú sa napr. . Používajú sa napr. pri prechádzaní štruktúrou, vkladaní a vymazávaní a pod.pri prechádzaní štruktúrou, vkladaní a vymazávaní a pod.

Každá štruktúra ma iný charakter – niektoré štruktúry umožňujú Každá štruktúra ma iný charakter – niektoré štruktúry umožňujú náhodný prístup, iné len postup od začiatku do konca, obojsmerný náhodný prístup, iné len postup od začiatku do konca, obojsmerný postup a pod. Preto v STL poznáme niekoľko typov iterátorov:postup a pod. Preto v STL poznáme niekoľko typov iterátorov:1. 1. Iterátor s náhodným prístupom – umožňuje náhodný prístup k – umožňuje náhodný prístup k prvkom štruktúr, ktoré to dovoľujúprvkom štruktúr, ktoré to dovoľujú2. 2. Obojsmerný iterátor – dá sa pomocou neho pohybovať vpred aj – dá sa pomocou neho pohybovať vpred aj vzad v rámci štruktúry, vždy však len o jedno miestovzad v rámci štruktúry, vždy však len o jedno miesto3. 3. Dopredný iterátor – slúži len na pohyb vpred o jedno miesto – slúži len na pohyb vpred o jedno miesto4. 4. Reverzný iterátor – slúži len na pohyb vzad o jedno miesto – slúži len na pohyb vzad o jedno miesto5. 5. Vstupný iterátor – dopredný iterátor, ktorý vie len čítať hodnoty – dopredný iterátor, ktorý vie len čítať hodnoty6. 6. Výstupný iterátor – dopredný iterátor, ktorý vie len zapisovať – dopredný iterátor, ktorý vie len zapisovať hodnotyhodnoty

Page 16: Kni žnice STL (Standard Template Library)

Vektory v STLVektory v STL Ako sme si už hovorili, vektor je dynamické pole, ktoré môže Ako sme si už hovorili, vektor je dynamické pole, ktoré môže

uchovávať prvky ľubovoľného typu.uchovávať prvky ľubovoľného typu. Aby sme mohli používať vektory, musíme do programu zahrnúť Aby sme mohli používať vektory, musíme do programu zahrnúť

knižnicu knižnicu <vector>, a dátový typ sa volá , a dátový typ sa volá vector..

V programe môžeme vytvoriť objekt typu V programe môžeme vytvoriť objekt typu vectorvector viacerými viacerými spôsobmi:spôsobmi:

1. 1. vector<typ> meno_vektora; – vytvor – vytvorí prázdny vektor s nulovou í prázdny vektor s nulovou dĺžkoudĺžkou

2. 2. vector<typ> meno_vektora(dĺžka, hodnota); - vytvorí vektor s - vytvorí vektor s dĺžkou dĺžkou dĺžkadĺžka, kt, ktoorého všetky prvky budú mať hodnotu rého všetky prvky budú mať hodnotu hodnotahodnota..

3. 3. vector<typ> meno_vektora(vektor1) – vytvor – vytvorí vektor, ktí vektor, ktoorý bude rý bude mať rovnaké prvky ako mať rovnaké prvky ako vektor1vektor1.. vektor1vektor1 musí byť rovnakého typu.musí byť rovnakého typu.

4. 4. vector<typ> meno_vektora(iterátor1, iterátor2) – vytvorí vektor, – vytvorí vektor, ktorý bude mať prvky nachádzajúce sa medzi miestami, na ktoré ktorý bude mať prvky nachádzajúce sa medzi miestami, na ktoré ukazujú ukazujú iterátor1iterátor1 a a iterátor2iterátor2. Iterátory musia ukazovať na rovnaký . Iterátory musia ukazovať na rovnaký typ prvkov, ako sú prvky vytváraného vektora.typ prvkov, ako sú prvky vytváraného vektora.

Page 17: Kni žnice STL (Standard Template Library)

Vektory v STLVektory v STL Teraz si uvedieme Teraz si uvedieme niektoré metódy triedy vector::

int size() – vráti aktuálnu veľkosť vektora – vráti aktuálnu veľkosť vektoraint capacity() – vráti aktuálnu kapacitu, teda maximálny počet prvkov, – vráti aktuálnu kapacitu, teda maximálny počet prvkov, ktoré ešte vektor dokáže prijať bez ďalšej alokáciektoré ešte vektor dokáže prijať bez ďalšej alokácievoid reserve(int n) – nastaví kapacitu vektora tak, že je rovná aspoň – nastaví kapacitu vektora tak, že je rovná aspoň nnvoid push_back(typ hodnota) – pridá hodnotu daného typu na koniec – pridá hodnotu daného typu na koniec vektora. Ak je už vektor plný, jeho kapacita sa zväčší, ak je to fyzicky vektora. Ak je už vektor plný, jeho kapacita sa zväčší, ak je to fyzicky možné.možné.void assign(int n, typ hodnota) – priradí vektoru – priradí vektoru nn prvkov s hodnotou prvkov s hodnotou hodnotahodnotavoid pop_back() – odstráni posledný prvok – odstráni posledný prvok&typ front() – vracia odkaz na prvý prvok vektora – vracia odkaz na prvý prvok vektora&typ back() – vracia odkaz na posledný prvok vektora – vracia odkaz na posledný prvok vektoraiterator begin() – vracia iterátor k prvému prvku vektora – vracia iterátor k prvému prvku vektoraiterator end() – vráti iterátor na koniec vektora – vráti iterátor na koniec vektoravoid clear() – vymaže všetky prvky – vymaže všetky prvkyiterator insert(iterator i, typ hodnota) – vloží hodnotu pred pozíciu – vloží hodnotu pred pozíciu určenú iterátorom určenú iterátorom ii. Vráti iterátor na vložený prvok.. Vráti iterátor na vložený prvok.iterator erase(iterator i) – odstráni prvok určený iterátorom – odstráni prvok určený iterátorom ii. Vráti . Vráti iterátor na prvok nasledujúci za vymazaným. iterátor na prvok nasledujúci za vymazaným.

Page 18: Kni žnice STL (Standard Template Library)

Vektory v STLVektory v STL Vektor napĺňame priamo v konštruktore, pomocou funkcií push_back

alebo assign. . Ak už máme vektor naplnený hodnotami, pristupujeme k , pristupujeme k jeho prvkom tak ako v prípade jednoduchého poľa – pomocou jeho prvkom tak ako v prípade jednoduchého poľa – pomocou operátora [ ]..

Príklad: Počítanie priemernej teploty: Počítanie priemernej teplotyV súbore máme teplotu nameranú o 12:00 za posledných niekoľko dní V súbore máme teplotu nameranú o 12:00 za posledných niekoľko dní (počet nie je známy). Máme načítať všetky hodnoty, uložiť ich do poľa a (počet nie je známy). Máme načítať všetky hodnoty, uložiť ich do poľa a potom vypočítať priemernú teplotu za toto obdobie.potom vypočítať priemernú teplotu za toto obdobie.

Vytvoríme triedu Vytvoríme triedu TeplomerTeplomer, ktorá sa bude starať o všetky operácie s , ktorá sa bude starať o všetky operácie s údajmi:údajmi:class Teplomer{

private: vector<float> teplota;public: void NacitajTeploty(char *filename); float PriemernaTeplota(); int PocetTeplot() {return teplota.size();}

};

Page 19: Kni žnice STL (Standard Template Library)

Vektory v STLVektory v STL Teraz definujeme metódy triedy Teraz definujeme metódy triedy TeplomerTeplomer, ktoré ešte neboli , ktoré ešte neboli

definované:definované:void Teplomer::NacitajTeploty(char *filename){

float t;fstream file(filename,fstream::in);while (!file.eof()){

file>>t;if (file.eof()) break;teplota.push_back(t);

}file.close();

}float Teplomer::PriemernaTeplota(){

float sum=0.;for (int i=0;i<teplota.size();i++) sum+=teplota[i];return sum/teplota.size();

}

Page 20: Kni žnice STL (Standard Template Library)

Vektory v STLVektory v STL Hlavný program:Hlavný program:

Teplomer T;T.NacitajTeploty("teploty.txt");cout<<"Priemerna teplota za poslednych "<<T.PocetTeplot()<<" dni bola "<<T.PriemernaTeplota()<<" stupnov"<<endl;return 0;

Ak máme v súbore zadané napr. tieto hodnoty:Ak máme v súbore zadané napr. tieto hodnoty:20.122.523.720.922.0

dostaneme výstup:dostaneme výstup:Priemerna teplota za poslednych 5 dni bola 21.84 stupnov

Page 21: Kni žnice STL (Standard Template Library)

Vektory v STLVektory v STL Príklad: Napĺňanie vektora pomocou operátora : Napĺňanie vektora pomocou operátora [ ][ ]

Predchádzajúci príklad prepíšeme tak, že nebudeme používať Predchádzajúci príklad prepíšeme tak, že nebudeme používať na napĺňanie vektora metódu na napĺňanie vektora metódu push_backpush_back, ale skúsime to len , ale skúsime to len priradením každého prvku. priradením každého prvku.Zmena teda nastane len vo funkcii Zmena teda nastane len vo funkcii NačítajTeplotyNačítajTeploty::void Teplomer::NacitajTeploty(char *filename){

float t;int i=0;fstream file(filename,fstream::in);while (!file.eof()){

file>>t;if (file.eof()) break;teplota[i]=t;i++;

}file.close();

}

Page 22: Kni žnice STL (Standard Template Library)

Vektory v STLVektory v STL Ak použijeme takýto kód, program sa bez problémov skompiluje, Ak použijeme takýto kód, program sa bez problémov skompiluje,

ale výstup nás veľmi nepoteší:ale výstup nás veľmi nepoteší:

Problém v tomto prípade nastal, pretože vektor Problém v tomto prípade nastal, pretože vektor teplotateplota bol bol prázdny a hlavne nemal inicializovaný žiadny rozmer. Preto prázdny a hlavne nemal inicializovaný žiadny rozmer. Preto nemôžeme pristupovať k nijakým jeho prvkom.nemôžeme pristupovať k nijakým jeho prvkom.

Page 23: Kni žnice STL (Standard Template Library)

Vektory v STLVektory v STL Môžeme si skúsiť pomôcť rezervovaním miesta pre vektor – v tom Môžeme si skúsiť pomôcť rezervovaním miesta pre vektor – v tom

prípade by nemal program spadnúť:prípade by nemal program spadnúť:

void Teplomer::NacitajTeploty(char *filename){

float t;int i=0;fstream file(filename,fstream::in);teplota.reserve(10);while (!file.eof()){

file>>t;if (file.eof()) break;teplota[i]=t;i++;

}file.close();

}

Page 24: Kni žnice STL (Standard Template Library)

Vektory v STLVektory v STL Skutočne, program nespadne, výstup však nebude oveľa lepší:Skutočne, program nespadne, výstup však nebude oveľa lepší:

Čo sa stalo tento raz?Čo sa stalo tento raz?

Teraz mal vektor Teraz mal vektor teplotateplota vyhradené miesto, a preto program vyhradené miesto, a preto program neskrachoval. Ale jeho veľkosť, ktorú vracia metóda neskrachoval. Ale jeho veľkosť, ktorú vracia metóda size()size(), bola stále , bola stále nulová. nulová. Pomocou reserve nastavujeme len kapacitu, teda koľko prvkov , teda koľko prvkov by sme mohli do vektora uložiť, ale skutočný počet prvkov môže byť by sme mohli do vektora uložiť, ale skutočný počet prvkov môže byť menší. Tým, že i-temu prvku niečo priradíme, nezmeníme veľkosť menší. Tým, že i-temu prvku niečo priradíme, nezmeníme veľkosť vektora, ktorú vracia vektora, ktorú vracia size()size(). Naopak, funkcia . Naopak, funkcia push_backpush_back túto veľkosť túto veľkosť zmení. Preto, aj keď sa hodnoty načítali, veľkosť bola stále evidovaná zmení. Preto, aj keď sa hodnoty načítali, veľkosť bola stále evidovaná ako nulová.ako nulová.Takže, vektor napĺňame len pomocou konštruktora, push_back a assign!

Page 25: Kni žnice STL (Standard Template Library)

Vektory a iterátoryVektory a iterátory Ak chceme Ak chceme vytvoriť iterátor k vektoru, urobíme to takto:, urobíme to takto:

vector<typ>::iterator meno_iterátoru; Niektoré prekladače vyžadujú, aby bola do programu zahrnutá Niektoré prekladače vyžadujú, aby bola do programu zahrnutá

knižnica knižnica <iterator>. S iterátorom narábame ako so smerníkom, teda ak chceme získať , teda ak chceme získať

hodnotu, na ktorú ukazuje, urobíme to takto:hodnotu, na ktorú ukazuje, urobíme to takto:*meno_iterátoru

Takisto môžeme používať smerníkovú aritmetiku, teda Takisto môžeme používať smerníkovú aritmetiku, teda pripočítavať a odpočítavať celočíselné hodnotypripočítavať a odpočítavať celočíselné hodnoty,, používať operátory používať operátory ++,--++,-- a aj priradi a aj priradiť ľubovoľnú hodnotu.ť ľubovoľnú hodnotu.

Treba si uvedomiť, že trieda vector umožňuje náhodný prístup, a Treba si uvedomiť, že trieda vector umožňuje náhodný prístup, a preto sú pre jej iterátor povolené všetky spomenuté operácie. preto sú pre jej iterátor povolené všetky spomenuté operácie. Neplatí to pre iterátory všetkých STL štruktúr. Ak si spomenieme Neplatí to pre iterátory všetkých STL štruktúr. Ak si spomenieme na typy iterátorov, na typy iterátorov, iterátor triedy vektor je iterátor s náhodným prístupom..

Page 26: Kni žnice STL (Standard Template Library)

Vektory a iterátoryVektory a iterátory Príklad: Výpis prvkov vektora pomocou iterátora: Výpis prvkov vektora pomocou iterátora

Budeme mať vektor znakov. Pomocou iterátora sa pokúsime Budeme mať vektor znakov. Pomocou iterátora sa pokúsime vypísať jeho obsah.vypísať jeho obsah.int main(){

char *s="Po pismenku vypiseme celu tuto vetu.";vector<char> veta;vector<char>::iterator iter;for (int i=0;i<36;i++) veta.push_back(s[i]);iter=veta.begin();for (i=0;i<veta.size();i++){

cout<<*iter;iter++;

}return 0;

}Výstup:Výstup:Po pismenku vypiseme celu tuto vetu.

Page 27: Kni žnice STL (Standard Template Library)

Vektory a iterátoryVektory a iterátory

Ten istý program sa dá zapísať aj iným, jednoduchším spôsobom. Ten istý program sa dá zapísať aj iným, jednoduchším spôsobom. Iterátor sa dá priamo použiť ako riadiaca premenná cyklu:Iterátor sa dá priamo použiť ako riadiaca premenná cyklu:

int main(){

char *s="Po pismenku vypiseme celu tuto vetu.";vector<char> veta;vector<char>::iterator iter;

for (int i=0;i<36;i++) veta.push_back(s[i]);for (iter=veta.begin();iter!=veta.end();iter++) cout<<*iter;return 0;

}

Page 28: Kni žnice STL (Standard Template Library)

Vektory a iterátoryVektory a iterátory Príklad: Vkladanie do vektora a vymazávanie z vektora: Vkladanie do vektora a vymazávanie z vektora

Majme opäť znakový vektor s týmto obsahom:Majme opäť znakový vektor s týmto obsahom:Tak sa mi zda, ze v tjto vete nieco nie je v pooriadku.Opravme chyby pomocou iterátorov.Opravme chyby pomocou iterátorov.int main(int argc, char* argv[]){

char *s="Tak sa mi zda, ze v tjto vete nieco nie je v pooriadku.";

vector<char> veta;vector<char>::iterator iter;

for (int i=0;i<55;i++) veta.push_back(s[i]);veta.insert(veta.begin()+21,'e');veta.erase(veta.begin()+47);for (iter=veta.begin();iter!=veta.end();iter++) cout<<*iter;return 0;

}Výstup:Výstup:Tak sa mi zda, ze v tejto vete nieco nie je v poriadku.

Page 29: Kni žnice STL (Standard Template Library)

Trieda stringTrieda string Už vieme, že znakový reťazec môžeme vytvoriť jednoducho Už vieme, že znakový reťazec môžeme vytvoriť jednoducho

ako pole znakov:ako pole znakov:char s[n];char *s;

Okrem toho mOkrem toho mááme vme vššak v C++ak v C++ aj triedu aj triedu string, definovanú , definovanú v knižnici v knižnici <string>, , ktorá umožňuje pohodlnejšiu a bohatšiu ktorá umožňuje pohodlnejšiu a bohatšiu prácu s reťazcami. Znakový reťazec vytvoríme jednoducho:prácu s reťazcami. Znakový reťazec vytvoríme jednoducho:string meno_reťazca;

PPre stringy re stringy ssú definované tieto operátory:ú definované tieto operátory:= - operátor priradenia - operátor priradenia+ - spojenie dvoch reťazcov - spojenie dvoch reťazcov+= - priradenie so spojením - priradenie so spojením==, != - testy rovnosti a nerovnosti - testy rovnosti a nerovnosti<, <=, >, >= - porovn - porovnávanieávanie[ ] – – prístup ku konkrétnemu znaku stringu prístup ku konkrétnemu znaku stringu

Page 30: Kni žnice STL (Standard Template Library)

Trieda stringTrieda string Okrem operOkrem operátorov má trieda átorov má trieda stringstring aj ďalšie užitočné metódy: aj ďalšie užitočné metódy:

int size() – vráti aktuálnu dĺžku stringu – vráti aktuálnu dĺžku stringu

const char *c_str() – vr – vráti pole znakov, ktoré tvorí obsah stringuáti pole znakov, ktoré tvorí obsah stringu

string &assign(string &s, int začiatok, int n) – – ddo stringu sa o stringu sa priradí priradí nn znakov zo stringu znakov zo stringu ss, začínajúc indexom , začínajúc indexom začiatokzačiatok..string &assign(char *s, int n) – do stringu sa prirad – do stringu sa priradí prvých í prvých nn znakov reťazca znakov reťazca ss..

string &append(string &s, int začiatok, int n) – k stringu sa pripojí – k stringu sa pripojí nn znakov zo stringu znakov zo stringu ss, začínajúc indexom , začínajúc indexom začiatokzačiatok..string &append(char *s, int n) – k stringu sa pripoj – k stringu sa pripojíí prvýchprvých n n zznakov nakov zz re reťazca ťazca ss..

Page 31: Kni žnice STL (Standard Template Library)

Trieda stringTrieda string Ďalšie metódy:Ďalšie metódy:

string &insert(int kam, string &s) – vlo – vloží do stringu string ží do stringu string ss, na pozíciu , na pozíciu kamkam..string &insert(int kam, string &s, int začiatok, int n) – vloží do stringu – vloží do stringu nn znakov zo stringu znakov zo stringu ss, na pozíciu , na pozíciu kamkam, začínajúc od indexu , začínajúc od indexu začiatokzačiatok..

string &replace(int odkiaľ, int n, string &s) – nahrad – nahradí í nn znakov v stringu znakov v stringu znakmi zo stringu znakmi zo stringu ss, začína indexom , začína indexom odkiaľodkiaľ..

string &erase(int začiatok=0, int n=npos) – vymaže zo stringu – vymaže zo stringu nn znakov, znakov, začínajúc od indexu začínajúc od indexu začiatokzačiatok. Ak neuvedieme . Ak neuvedieme začiatokzačiatok, začína sa od , začína sa od prvého znaku, ak neuvedieme ani prvého znaku, ak neuvedieme ani nn, vymaže sa všetko. , vymaže sa všetko. nposnpos je je konštanta, ktorá udáva maximálnu možnú dĺžku stringu, jej hodnota konštanta, ktorá udáva maximálnu možnú dĺžku stringu, jej hodnota býva zvyčajne -1.býva zvyčajne -1.

int find(string &s, int začiatok=0) – nájde v stringu string – nájde v stringu string ss, začína hľadať , začína hľadať od pozície začiatok. Ak sa hľadaný reťazec nenájde, funkcia vráti od pozície začiatok. Ak sa hľadaný reťazec nenájde, funkcia vráti nposnpos..int find(char *s, int začiatok=0) – nájde v stringu reťazec – nájde v stringu reťazec ss

Page 32: Kni žnice STL (Standard Template Library)

Trieda stringTrieda string Príklad: Skladanie vety: Skladanie vety

Majme dané tieto slová: Majme dané tieto slová: Robiť, Starosti, Asi, Počítaču, Nebude, Abeceda..Zložme z nich vetu tak, aby v nej tieto slová boli usporiadané podľa Zložme z nich vetu tak, aby v nej tieto slová boli usporiadané podľa abecedy.abecedy.

#include <iostream>#include <string>

using namespace std;

int main(){

int min;string veta="", s;string

Slova[6]={"Robit","Starosti","Asi","Pocitacu","Nebude","Abeceda"};...

Page 33: Kni žnice STL (Standard Template Library)

Trieda stringTrieda string V V ďalšej časti programu slová utriedime a spojíme do vety. ďalšej časti programu slová utriedime a spojíme do vety.

Využijeme pritom operátory triedy Využijeme pritom operátory triedy stringstring::for (int i=0;i<5;i++) {

min=i;for (int j=i+1;j<6;j++) if (Slova[j]<Slova[min])

min=j;if (min!=i){

s=Slova[min];Slova[min]=Slova[i];Slova[i]=s;

}}for (i=0;i<6;i++) veta+=Slova[i]+" ";cout<<veta<<endl;return 0;

}Výstup:Výstup:Abeceda Asi Nebude Pocitacu Robit Starosti

Page 34: Kni žnice STL (Standard Template Library)

Načítanie objektu triedy Načítanie objektu triedy stringstring

Ak chceme správne načítať objekt typu string, nemôžeme použiť metódu getline príslušného streamu, pretože tá má ako parameter , pretože tá má ako parameter jednoduché znakové pole a nie objekt triedy jednoduché znakové pole a nie objekt triedy stringstring. Pre . Pre stringstring máme podobnú funkciu, ktorá nie je metódou nijakej triedy. Táto máme podobnú funkciu, ktorá nie je metódou nijakej triedy. Táto funkcia sa takisto volá funkcia sa takisto volá getlinegetline a jej syntax je: a jej syntax je:basic_istream &getline(basic_istream &str, string &s);

TTáto funkcia načíta string áto funkcia načíta string ss zo streamu zo streamu strstr. Týmto streamom môže . Týmto streamom môže byť akýkoľvek vstupný stream, teda napr. súbor alebo objekt byť akýkoľvek vstupný stream, teda napr. súbor alebo objekt cincin. . Ak teda chceme načítať string Ak teda chceme načítať string ss z klávesnice, napíšeme: z klávesnice, napíšeme:getline(cin,s);

Ak ho chceme načítať zo súboru, napíšeme:Ak ho chceme načítať zo súboru, napíšeme:getline(meno_suboru,s);

Page 35: Kni žnice STL (Standard Template Library)

Načítanie objektu triedy Načítanie objektu triedy stringstring Príklad: Úprava výrokov na pozitívne: Úprava výrokov na pozitívne

Napíšeme program, ktorý od užívateľa načíta vetu. Ak sa v nej Napíšeme program, ktorý od užívateľa načíta vetu. Ak sa v nej bude nachádzať slovo „zlýbude nachádzať slovo „zlý””, vymaže ho a nahradí slovom „dobrý, vymaže ho a nahradí slovom „dobrý”.”.string veta;cout<<"Napis nejaku vetu"<<endl;getline(cin,veta);int kde_je=veta.find("zly");if (kde_je==-1) cout<<"V tejto vete nie je nic zle"<<endl;else {

veta.erase(kde_je,3);veta.insert(kde_je,"dobry");cout<<"Opravil som tvoju vetu: "<<endl<<veta<<endl;

}Napis nejaku vetuDnes je nejaky zly den!Opravil som tvoju vetu:Dnes je nejaky dobry den!

Page 36: Kni žnice STL (Standard Template Library)

ZhrnutieZhrnutie

STL (Standard Template Library) je súbor knižníc, ktoré obsahujú STL (Standard Template Library) je súbor knižníc, ktoré obsahujú bežné dátové štruktúry a prostriedky na prácu s nimibežné dátové štruktúry a prostriedky na prácu s nimi

Základnými prvkami STL sú dátové štruktúry, algoritmy a iterátoryZákladnými prvkami STL sú dátové štruktúry, algoritmy a iterátory Najpoužívanejšie dátové štruktúry definované v STL Najpoužívanejšie dátové štruktúry definované v STL ssú vektor, ú vektor,

zoznam (fronta a zásobník), mapa, množina a string.zoznam (fronta a zásobník), mapa, množina a string. Vektor je dynamické pole, ktoré môže kedykoľvek meniť svoju Vektor je dynamické pole, ktoré môže kedykoľvek meniť svoju

kapacitu podľa potrieb programukapacitu podľa potrieb programu String je znakový reťazec, ktorý na rozdiel od obyčajného String je znakový reťazec, ktorý na rozdiel od obyčajného

znakového poľa umožňuje používať aj štandardné operátory a znakového poľa umožňuje používať aj štandardné operátory a rôzne iné metódy pre pohodlnejšiu prácu s nímrôzne iné metódy pre pohodlnejšiu prácu s ním