Sobes.tech
Junior

Czym jest iterator w standardowej bibliotece szablonów (STL)?

sobes.tech AI

Odpowiedź od AI

Iterator w STL to uogólniona koncepcja, która zapewnia sposób dostępu do elementów kontenera (np. vector, list, map) w sposób sekwencyjny, bez ujawniania wewnętrznej struktury tego kontenera. Jest podobny do wskaźnika na element, ale z dodatkowymi możliwościami w zależności od kategorii iteratora.

Główne funkcje iteratora:

  • Dostęp do bieżącego elementu (*it).
  • Przemieszczanie się do następnego elementu (++it).
  • Porównanie z innym iteratorem (np. w celu określenia końca sekwencji it != end()).

Kategorie iteratorów (w kolejności rozszerzania możliwości):

  1. Input Iterator: Może odczytywać elementy tylko raz (np. wejście z strumienia). Obsługuje *it (do odczytu), ++it, it == inny.
  2. Output Iterator: Może zapisywać elementy tylko raz (np. wyjście do strumienia). Obsługuje *it (do zapisu), ++it.
  3. Forward Iterator: Może odczytywać i zapisywać elementy wielokrotnie i może się poruszać tylko do przodu. Obsługuje *it (odczyt/zapis), ++it, it == inny.
  4. Bidirectional Iterator: Może się poruszać do przodu i do tyłu. Obsługuje wszystkie operacje Forward Iterator, a także --it.
  5. Random Access Iterator: Może się przemieszczać o dowolną liczbę elementów w jednym kroku (jak wskaźniki). Obsługuje wszystkie operacje Bidirectional Iterator, a także:
    • it + n, it - n (przemieszczenie o n elementów)
    • it += n, it -= n
    • it[n] (dostęp do elementu z przesunięciem n)
    • it < inny, <=, >, >= (porównanie pozycji)

Przykład użycia:

#include <vector>
#include <iostream>

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

    // Uzyskujemy iterator na początek kontenera
    std::vector<int>::iterator it = v.begin();

    // Przechodzimy przez elementy za pomocą iteratora
    while (it != v.end()) {
        std::cout << *it << " "; // Dereferencja iteratora do dostępu do wartości
        ++it; // Przejście do następnego elementu
    }
    std::cout << std::endl; // Wyjście: 1 2 3 4 5

    return 0;
}

Iteratory zapewniają abstrakcję nad konkretnym typem kontenera, umożliwiając algorytmom STL pracę z różnymi typami danych w sposób jednolity.