0Pricing
C++ Academy · Lekcja

Typowe wzorce iteratorów: begin, end, advance

Skutecznie używaj std::begin, std::end, std::advance i iteratorów odwrotnych

Typowe wzorce iteratorów: begin, end, advance to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 2 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.

begin() i end()

Każdy standardowy kontener udostępnia begin() (pierwszy element) i end() (pozycja za ostatnim elementem). Półotwarty zakres [begin, end) to standardowy sposób iterowania.

std::vector<int> v = {1, 2, 3};
for (auto it = v.begin(); it != v.end(); ++it) {
    std::cout << *it << " ";
}

std::begin i std::end

Wolne funkcje z <iterator>, które działają z dowolnym kontenerem, w tym z tablicami języka C.

int arr[] = {1, 2, 3, 4};
for (auto it = std::begin(arr); it != std::end(arr); ++it) {
    std::cout << *it << " ";
}

cbegin i cend

Wersje z c zwracają const_iterator. Należy ich używać, gdy nie trzeba modyfikować elementów i chcą Państwo, aby kompilator to wymuszał.

rbegin i rend

Iteratory odwrotne. rbegin() wskazuje ostatni element, a rend() pozycję przed pierwszym.

for (auto it = v.rbegin(); it != v.rend(); ++it) {
    std::cout << *it << " ";
}

std::next i std::prev

Zwracają iterator przesunięty względem innego iteratora bez modyfikowania oryginału.

auto it = v.begin();
auto next3 = std::next(it, 3);     // it + 3
auto prev1 = std::prev(it);         // it - 1

std::advance

Modyfikuje iterator w miejscu, przesuwając go o określoną odległość. Wybiera najlepszą implementację na podstawie kategorii iteratora.

auto it = v.begin();
std::advance(it, 5);          // moves it forward by 5

std::distance

Mierzy liczbę kroków między dwoma iteratorami. Działa w czasie O(1) dla iteratorów swobodnego dostępu i O(n) w pozostałych przypadkach.

auto d = std::distance(v.begin(), it);   // index of it

Iteratory wstawiające

Adaptery, które zamieniają przypisanie na wstawianie:

  • std::back_inserter — push_back
  • std::front_inserter — push_front
  • std::inserter — wstawianie w określonej pozycji
std::vector<int> dst;
std::copy(src.begin(), src.end(), std::back_inserter(dst));

Iteratory strumieniowe

Strumieni można używać jak zakresów za pomocą std::istream_iterator i std::ostream_iterator.

// Read all ints from cin, print to cout
std::copy(
    std::istream_iterator<int>(std::cin),
    std::istream_iterator<int>{},
    std::ostream_iterator<int>(std::cout, " ")
);

Usuwanie podczas iteracji

erase zwraca następny prawidłowy iterator. Należy go przechwycić i ponownie wykorzystać.

for (auto it = v.begin(); it != v.end(); ) {
    if (*it < 0) it = v.erase(it);
    else         ++it;
}

Unieważnianie iteratorów

Modyfikowanie kontenera może unieważnić jego iteratory. Wektor unieważnia je podczas zmiany rozmiaru, natomiast lista zachowuje ważność iteratorów z wyjątkiem iteratorów usuniętych elementów.

Szybki test

Która funkcja zwraca iterator wskazujący pozycję za ostatnim elementem kontenera?

Podsumowanie

Do iteracji w przód należy używać begin()/end(), a do iteracji wstecz — rbegin()/rend(). std::next, std::prev, std::advance i std::distance działają w sposób generyczny. Iteratory wstawiające zamieniają przypisanie na wstawianie.

Często zadawane pytania

Czy lekcja „Typowe wzorce iteratorów: begin, end, advance” jest bezpłatna?

Tak — pełny tekst „Typowe wzorce iteratorów: begin, end, advance” 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 „Typowe wzorce iteratorów: begin, end, advance”?

Skutecznie używaj std::begin, std::end, std::advance i iteratorów odwrotnych Ć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 2 z 4.

Ile czasu zajmuje lekcja „Typowe wzorce iteratorów: begin, end, advance”?

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