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 - 1std::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 5std::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 itIteratory wstawiające
Adaptery, które zamieniają przypisanie na wstawianie:
std::back_inserter— push_backstd::front_inserter— push_frontstd::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
- 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