Sobes.tech
Junior

Čo je to iterátor v štandardnej knižnici šablón (STL)?

sobes.tech AI

Odpoveď od AI

Iterátor v STL je všeobecná koncepcia, ktorá poskytuje spôsob prístupu k prvkom kontajnera (napríklad vector, list, map) postupne, bez odhalenia vnútorné štruktúry tohto kontajnera. Je to podobné ukazovateľovi na prvok, ale s ďalšími možnosťami v závislosti od kategórie iterátora.

Hlavné funkcie iterátora:

  • Získanie prístupu k aktuálnemu prvku (*it).
  • Presun na ďalší prvok (++it).
  • Porovnanie s iným iterátorom (napríklad na určenie konca sekvencie it != end()).

Kategórie iterátorov (v poradí rozšírenia možností):

  1. Input Iterator: Môžu čítať prvky raz (napríklad vstup zo streamu). Podporujú *it (na čítanie), ++it, it == other.
  2. Output Iterator: Môžu zapisovať prvky raz (napríklad výstup do streamu). Podporujú *it (na zápis), ++it.
  3. Forward Iterator: Môžu čítať a zapisovať prvky opakovane a pohybovať sa iba dopredu. Podporujú *it (čítanie/zápis), ++it, it == other.
  4. Bidirectional Iterator: Môžu sa pohybovať dopredu aj dozadu. Podporujú všetky operácie Forward Iterator, ako aj --it.
  5. Random Access Iterator: Môžu sa pohybovať na ľubovoľný počet prvkov za jeden krok (ako ukazovatele). Podporujú všetky operácie Bidirectional Iterator, ako aj:
    • it + n, it - n (presun o n prvkov)
    • it += n, it -= n
    • it[n] (prístup k prvku so posunom n)
    • it < other, <=, >, >= (porovnanie pozícií)

Príklad použitia:

#include <vector>
#include <iostream>

int main() {
    std::vector<int> v = {1, 2, 3, 4, 5};

    // Získanie iterátora na začiatok kontajnera
    std::vector<int>::iterator it = v.begin();

    // Prechádzanie prvkov pomocou iterátora
    while (it != v.end()) {
        std::cout << *it << " "; // Dereferencovanie iterátora na prístup k hodnote
        ++it; // Presun na ďalší prvok
    }
    std::cout << std::endl; // Výstup: 1 2 3 4 5

    return 0;
}

Iterátory zabezpečujú abstrakciu nad konkrétnym typom kontajnera, umožňujúc algoritmom STL pracovať s rôznymi typmi dát jednotne.