Sobes.tech
Junior

Kādus iteratora veidus pazīsti?

sobes.tech AI

Atbilde no AI

C++ iteratori ir irģenerēti norādītāji, kas nodrošina piekļuvi konteineru elementiem un to pārvietošanos. Saskaņā ar C++ standartu, ir izdalītas piecas galvenās iterāciju kategorijas, kas sakārtotas pēc to iespējām pieaugošā secībā:

  • Ieejas iteratori:
    • ļauj tikai lasīt elementus (operator*() const),
    • ļauj palielināt iteratoru (operator++()),
    • atbalsta vienādojuma salīdzināšanu (operator==(), operator!=()),
    • piemērs: ieejas straumju iteratori (std::istream_iterator).
  • Izlaides iteratori:
    • ļauj tikai rakstīt elementus (operator*()),
    • ļauj palielināt iteratoru (operator++()),
    • piemērs: izejas straumju iteratori (std::ostream_iterator).
  • Priekšējie iteratori:
    • atbalsta visas ieejas un izejas iterāciju iespējas,
    • garantē, ka iteratora palielināšana vienmēr noved pie nākamā elementa vai sekvences beigām,
    • piemērs: vienvirziena sarakstu iteratori (std::forward_list).
  • Divvirziena iteratori:
    • atbalsta visas priekšējās iterāciju iespējas,
    • ļauj samazināt iteratoru (operator--()) atpakaļ uz iepriekšējo elementu,
    • piemērs: sarakstu (std::list) un kopu (std::set) iteratori.
  • Nejaušas piekļuves iteratori:
    • atbalsta visas divvirziena iterāciju iespējas,
    • ļauj veikt aritmētiskas operācijas ar iteratoriem (saskaitīšana/atņemšana ar veseliem skaitļiem, atņemšana starp iteratori),
    • ļauj izmantot operatoru [] piekļuvei elementiem pēc indeksa,
    • piemērs: vektoru (std::vector) un masīvu (std::array) iteratori.

Šī hierarhija pieņem, ka katra nākamā kategorija ir pilnībā aprīkota ar iepriekšējo iespēju kopumu. Piemēram, nejaušas piekļuves iterators ir arī divvirziena, priekšējais, ieejas un izejas iterators.

#include <vector>
#include <list>
#include <forward_list>
#include <iostream>
#include <iterator>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    // Nejaušas piekļuves iterators
    auto vec_it = vec.begin();
    vec_it += 2; // Nejaušas piekļuves
    std::cout << *vec_it << std::endl; // Izvade: 3

    std::list<int> lst = {10, 20, 30};
    // Divvirziena iterators
    auto list_it = lst.begin();
    ++list_it; // Inkrements
    --list_it; // Dekrements

    std::forward_list<int> flst = {100, 200, 300};
    // Priekšējais iterators
    auto flist_it = flst.begin();
    ++flist_it; // Tik inkrementācija

    // Ieejas iterators
    std::istream_iterator<int> input_it(std::cin);
    // Izlaides iterators
    std::ostream_iterator<int> output_it(std::cout, " ");

    return 0;
}

Tāpat ir iterāciju adapteri (piemēram, std::reverse_iterator, std::move_iterator), kas maina pamata iterāciju uzvedību.