Funkcie begin a end
Ak pracujeme s nejakým reťazcom, tak potrebujeme často pristupovať k jednotlivým prvkom reťazca. Májme napríklad takýto blok kódu, ktorý už isto poznáte:
for (size_t i = 0; i < retazec.size(); i++)
{
cout << retazec[i];
}
Ako vidíme na malej ukážke, blok kódu vypisuje jednotlivé prvky reťazca. Nič zložité. Ale napadne vás otázka, či sa to nedá urobiť aj inak? Dá a to s pomocou knižnice string. Nie žeby riešenie s pomocou string nejak zmenšil počet znakov na napísanie cyklu, ale ako si ukážeme, niekde sa hodí omnoho viac ako štandardný zápis. Taktiež podporuje knižnica string napr. reverziu či swap, takže sa nemusíte zaťažovať algoritmami.
Z môjho pohľadu je to skôr na škodu, pretože často programátor nemusí tušiť, ako sa robí algoritmický swap, len využije funkciu. Avšak vedieť algoritmy nie je nikdy na škodu. Samozrejme, v prípade projektov pre klientov je šetrenie časom obrovská výhoda. Preto si prejdeme najzaujímavejšie funkcie knižnice string a celý minicyklus bude dlhšie trvať. No ale poďme späť k funkciám begin a end.
Funkcia begin vracia iterátor, ktorý ukazuje na prvý prvok v reťazci. Funkcia end ako už tušíte, vracia iterátor, ktorý je ale za posledným prvkom! Nie posledný prvok, ale ukazuje na symbol \0, keď ešte pamätáte na štruktúru reťazca. Čo je iterátor? Obvykle ukazuje na nejaký prvok v reťazci (alebo poľa, zoznamu a pod…) a vie ľahko prechádzať medzi prvkami pomocou inkrementácie alebo dekrementácie. Je ešte k iterátoru komplikovanejšia definícia, ale zatiaľ je to pre vás nepodstatné.
1. príklad: Zoznámenie sa s funkciami begin a end
#include <iostream> // hlavickové súbory #include <string> using namespace std; // priestor mien int main() // hlavná funkcia main { string retazec = "Hlasim, ze lietadlo pristalo na zem v poriadku!"; // naplníme reťazec for (string::iterator ite = retazec.begin(); ite != retazec.end(); ite++) // cyklus cout << *ite; // vypíšeme na obrazovku return 0; // koniec programu }
Výsledok programu:
Hlasim, ze lietadlo pristalo na zem v poriadku!
Rozbor programu:
Ako vidíte, veľa nových veci na vás vyskočilo behom tohto kratučkého programu. Ako prvé si je zvyknúť na pointery, ktoré sú označení *názovPremennej. Pointery si pamätajú adresy v operačnej pamäti, v ktorej sú uložené rôzne dátové typy premenných. No o pointeroch si ešte bližšie porozprávame niekedy v budúcností. Ďalej aby sme úspešne využili funkcie begin a end, potrebujeme iterátor. Keďže chceme pracovať s reťazcom, tak definujeme iterátor takto: string::iterator.
Skúsme sa pohrať trochu s funkciami begin a end.
2. príklad:
#include <iostream> // hlavickové súbory #include <string> using namespace std; // priestor mien int main() // hlavná funkcia main { string retazec = "Hlasim, ze lietadlo pristalo na zem v poriadku!"; // naplníme reťazec for (string::iterator ite = retazec.begin(); ite != retazec.end()-10; ite++) // cyklus cout << *ite; // vypíšeme na obrazovku return 0; // koniec programu }
Výsledok programu:
Hlasim, ze lietadlo pristalo na zem v
3. príklad:
#include <iostream> // hlavickové súbory #include <string> using namespace std; // priestor mien int main() // hlavná funkcia main { string retazec = "Hlasim, ze lietadlo pristalo na zem v poriadku!"; // naplníme reťazec for (string::iterator ite = retazec.begin()+11; ite != retazec.end()-28; ite++) // cyklus cout << *ite; // vypíšeme na obrazovku return 0; // koniec programu }
Výsledok programu:
lietadlo