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).
- ļauj tikai lasīt elementus (
- Izlaides iteratori:
- ļauj tikai rakstīt elementus (
operator*()), - ļauj palielināt iteratoru (
operator++()), - piemērs: izejas straumju iteratori (
std::ostream_iterator).
- ļauj tikai rakstīt elementus (
- 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.