0Pricing
C++ Academy · Lekcja

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 element

Iteratory 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

  1. Kategorie iteratorów: input, forward, bidirectional, random
  2. Typowe wzorce iteratorów: begin, end, advance
  3. Wprowadzenie do biblioteki zakresów C++20
  4. Adaptery zakresów: views::filter, transform, take
← Powrót do C++ Academy