Sobes.tech
Junior

Co je to iterátor v knihovně standardních šablon (STL)?

sobes.tech AI

Odpověď od AI

Iterátor v STL je obecný koncept, který poskytuje způsob přístupu k prvkům kontejneru (například vector, list, map) sekvenčně, aniž by odhaloval vnitřní strukturu tohoto kontejneru. Je podobný ukazateli na prvek, ale s dalšími možnostmi v závislosti na kategorii iterátoru.

Hlavní funkce iterátoru:

  • Přístup k aktuálnímu prvku (*it).
  • Přesun k dalšímu prvku (++it).
  • Porovnání s jiným iterátorem (například pro určení konce sekvence it != end()).

Kategorie iterátorů (v pořadí rozšiřování možností):

  1. Input Iterator: Může číst prvky pouze jednou (například vstup ze streamu). Podporuje *it (pro čtení), ++it, it == jiný).
  2. Output Iterator: Může zapisovat prvky pouze jednou (například výstup do streamu). Podporuje *it (pro zápis), ++it).
  3. Forward Iterator: Může číst a zapisovat prvky opakovaně a může se pohybovat pouze vpřed. Podporuje *it (čtení/zápis), ++it, it == jiný).
  4. Bidirectional Iterator: Může se pohybovat vpřed i vzad. Podporuje všechny operace Forward Iterator, plus --it).
  5. Random Access Iterator: Může se pohybovat libovolným počtem prvků v jednom kroku (jako ukazatele). Podporuje všechny operace Bidirectional Iterator, plus:
    • it + n, it - n (pohyb o n prvků)
    • it += n, it -= n
    • it[n] (přístup k prvku s posunem n)
    • it < jiný, <=, >, >= (porovnání pozic)

Příklad použití:

#include <vector>
#include <iostream>

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

    // Získání iterátoru na začátek kontejneru
    std::vector<int>::iterator it = v.begin();

    // Procházení prvků pomocí iterátoru
    while (it != v.end()) {
        std::cout << *it << " "; // Dereference iterátoru pro přístup k hodnotě
        ++it; // Přechod na další prvek
    }
    std::cout << std::endl; // Výstup: 1 2 3 4 5

    return 0;
}

Iterátory poskytují abstrakci nad konkrétním typem kontejneru, umožňující algoritmům STL pracovat s různými datovými typy jednotně.