Sobes.tech
Junior

Kas yra iteratorius standartinių šablonų bibliotekoje (STL)?

sobes.tech AI

Atsakymas iš AI

STL iteratori yra bendroji koncepcija, kuri suteikia būdą prieiti prie konteinerio elementų nuosekliai, nesuteikiant galimybės atskleisti šio konteinerio vidinės struktūros. Tai panašu į rodyklę į elementą, bet su papildomomis galimybėmis, priklausomai nuo iteratoriaus kategorijos.

Pagrindinės iteratoriaus funkcijos:

  • Pasiekti esamą elementą (*it).
  • Pereiti prie kito elemento (++it).
  • Palyginti su kitu iteratoriumi (it != end()).

Iteratoriaus kategorijos (pagal galimybių išplėtimą):

  1. Input Iterator: Gali skaityti elementus vieną kartą (pvz., įvestis iš srauto). Palaiko *it (skaityti), ++it, it == other.
  2. Output Iterator: Gali rašyti elementus vieną kartą (pvz., išvestis į srautą). Palaiko *it (rašyti), ++it.
  3. Forward Iterator: Gali skaityti ir rašyti elementus daug kartų ir juda tik į priekį. Palaiko *it (skaityti/rašyti), ++it, it == other.
  4. Bidirectional Iterator: Gali judėti į priekį ir atgal. Palaiko visas Forward Iterator operacijas, taip pat --it.
  5. Random Access Iterator: Gali judėti bet kokiu kiekiu elementų vienu žingsniu (kaip rodyklės). Palaiko visas Bidirectional Iterator operacijas, taip pat:
    • it + n, it - n (perkelti n elementų)
    • it += n, it -= n
    • it[n] (prieiga prie elemento su poslinkiu n)
    • it < other, <=, >, >= (pozicijų palyginimas)

Pavyzdys:

#include <vector>
#include <iostream>

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

    // Gauti iteratorių nuo konteinerio pradžios
    std::vector<int>::iterator it = v.begin();

    // Pereiti per elementus naudojant iteratorių
    while (it != v.end()) {
        std::cout << *it << " "; // Išskleisti iteratorių, kad gauti reikšmę
        ++it; // Pereiti prie kito elemento
    }
    std::cout << std::endl; // Rezultatas: 1 2 3 4 5

    return 0;
}

Iteratorių dėka galima sukurti abstrakciją virš konkretaus konteinerio tipo, leidžiant STL algoritmams dirbti su įvairių tipų duomenimis vienodai.