Sobes.tech
Junior

Ce este un iterator în biblioteca standard de șabloane (STL)?

sobes.tech AI

Răspuns de la AI

Iteratorul în STL este un concept generalizat care oferă o modalitate de accesare a elementelor unui container (de exemplu, vector, list, map) în mod secvențial, fără a dezvălui structura internă a acestuia. Este similar cu un pointer către un element, dar cu capacități suplimentare în funcție de categoria iteratorului.

Funcțiile principale ale iteratorului:

  • Accesarea elementului curent (*it).
  • Mutarea către elementul următor (++it).
  • Compararea cu alt iterator (de exemplu, pentru a determina sfârșitul secvenței it != end()).

Categoriile de iteratori (în ordinea extinderii capacităților):

  1. Input Iterator: Poate citi elemente o singură dată (de exemplu, intrare dintr-un flux). Suportă *it (pentru citire), ++it, it == altul).
  2. Output Iterator: Poate scrie elemente o singură dată (de exemplu, ieșire într-un flux). Suportă *it (pentru scriere), ++it).
  3. Forward Iterator: Poate citi și scrie elemente de mai multe ori și se poate deplasa doar înainte. Suportă *it (citire/scriere), ++it, it == altul).
  4. Bidirectional Iterator: Poate să se deplaseze înainte și înapoi. Suportă toate operațiile de Forward Iterator, plus --it).
  5. Random Access Iterator: Poate să se deplaseze la un număr arbitrar de elemente într-un singur pas (ca și pointerii). Suportă toate operațiile de Bidirectional Iterator, plus:
    • it + n, it - n (deplasare cu n elemente)
    • it += n, it -= n
    • it[n] (accesează elementul cu deplasare n)
    • it < altul, <=, >, >= (compararea pozițiilor)

Exemplu de utilizare:

#include <vector>
#include <iostream>

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

    // Obțineți un iterator la începutul containerului
    std::vector<int>::iterator it = v.begin();

    // Parcurgeți elementele cu ajutorul iteratorului
    while (it != v.end()) {
        std::cout << *it << " "; // Dereferențierea iteratorului pentru accesarea valorii
        ++it; // Trecerea la elementul următor
    }
    std::cout << std::endl; // Ieșire: 1 2 3 4 5

    return 0;
}

Iteratorii oferă o abstracție asupra tipului specific al containerului, permițând algoritmilor STL să funcționeze uniform cu diferite tipuri de date.