Kategorie iteratorów: input, forward, bidirectional, random
Rozróżniaj kategorie iteratorów i wybieraj pasujące do nich algorytmy
Kategorie iteratorów: input, forward, bidirectional, random to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C++ Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C++ Academy zawiera 4 lekcji w sumie.
Czym jest iterator?
Iterator to uogólniony wskaźnik. Algorytmy działają za pośrednictwem iteratorów, dzięki czemu są niezależne od bazowego kontenera.
Pięć kategorii iteratorów
Iteratory klasyfikuje się według ich możliwości:
- Input — tylko do odczytu, jednokrotne przejście
- Output — tylko do zapisu, jednokrotne przejście
- Forward — odczyt i zapis, wielokrotne przejście
- Bidirectional — możliwość poruszania się do przodu i do tyłu
- Random Access — możliwość przeskakiwania o całkowity offset
Iteratory wejściowe
Odczyt, przesunięcie i powtórzenie. Nie można wrócić do wcześniejszego elementu. Przykład: std::istream_iterator.
std::istream_iterator<int> in(std::cin), end;
while (in != end) {
std::cout << *in << " ";
++in;
}Iteratory wyjściowe
Tylko do zapisu. Przykłady: std::ostream_iterator i std::back_inserter.
std::ostream_iterator<int> out(std::cout, " ");
std::vector<int> v = {1, 2, 3};
std::copy(v.begin(), v.end(), out);Iteratory jednokierunkowe
Podobne do iteratorów wejściowych, ale umożliwiają wielokrotne przejście — można ponownie iterować od tej samej pozycji. Przykład: std::forward_list.
Iteratory dwukierunkowe
Iteratory jednokierunkowe rozszerzone o operację --. Przykłady: std::list, std::map, std::set.
std::list<int> l = {1, 2, 3};
auto it = l.end();
--it; // OK, points to last elementIteratory swobodnego dostępu
Iteratory dwukierunkowe rozszerzone o przeskakiwanie: it + n, it - n, it[k], it1 - it2. Przykłady: std::vector, std::deque, zwykłe tablice.
Wymagania algorytmów
Każdy algorytm określa minimalną wymaganą kategorię iteratora. std::sort wymaga iteratorów swobodnego dostępu, a std::find wymaga jedynie iteratora wejściowego.
Cechy iteratorów
std::iterator_traits<Iter> udostępnia w czasie kompilacji typ wartości iteratora, jego kategorię oraz inne właściwości.
using Category = std::iterator_traits<It>::iterator_category;
using Value = std::iterator_traits<It>::value_type;std::advance i std::distance
Umożliwiają generyczne przesunięcie iteratora lub zmierzenie odległości. Wykorzystują kategorię iteratora, aby wybrać najbardziej wydajną implementację.
auto it = v.begin();
std::advance(it, 5); // efficient on random access, O(n) otherwise
auto d = std::distance(v.begin(), it);Niestandardowe iteratory
Aby napisać własny iterator, należy zdefiniować wymagane aliasy typów i operacje dla wybranej kategorii — operator*, operator++, operator== itd.
Koncepty iteratorów w C++20
W C++20 dodano formalne koncepty, takie jak std::input_iterator, std::forward_iterator i std::random_access_iterator. Zastępują one starszy system oparty na tagach.
Szybki test
Która kategoria iteratora obsługuje wyrażenie it + n w czasie stałym?
Podsumowanie
Iteratory klasyfikuje się według możliwości: wejściowe, wyjściowe, jednokierunkowe, dwukierunkowe i swobodnego dostępu. Algorytmy wymagają minimalnej kategorii iteratora. Iteratory vector są iteratorami swobodnego dostępu, a iteratory list i map — iteratorami dwukierunkowymi.
Często zadawane pytania
Czy lekcja „Kategorie iteratorów: input, forward, bidirectional, random” jest bezpłatna?
Tak — pełny tekst „Kategorie iteratorów: input, forward, bidirectional, random” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C++ Academy, przejdź na CoddyKit PRO. Kurs C++ Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Kategorie iteratorów: input, forward, bidirectional, random”?
Rozróżniaj kategorie iteratorów i wybieraj pasujące do nich algorytmy Ćwiczysz C++ Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C++ Academy?
Nie wymagamy żadnego doświadczenia. C++ Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Kategorie iteratorów: input, forward, bidirectional, random”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C++ Academy?
Tak. Każda lekcja C++ Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Kategorie iteratorów: input, forward, bidirectional, random
- Typowe wzorce iteratorów: begin, end, advance
- Wprowadzenie do biblioteki zakresów C++20
- Adaptery zakresów: views::filter, transform, take