0Pricing
C++ Academy · Lekcja

Wprowadzenie do biblioteki zakresów C++20

Używaj algorytmów std::ranges, które przyjmują zakresy zamiast par iteratorów

Wprowadzenie do biblioteki zakresów C++20 to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 3 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.

Dlaczego zakresy?

Tradycyjny STL przyjmuje pary iteratorów (v.begin(), v.end()). Zakresy w C++20 przyjmują pojedynczą wartość zakresu i umożliwiają kompozycję operacji.

Dołączanie zakresów

Należy dołączyć <ranges>. Przestrzeń nazw std::ranges służy do algorytmów, a std::views do leniwych widoków.

#include <ranges>
#include <algorithm>

Algorytmy zakresów

Każdy standardowy algorytm ma odpowiednik w przestrzeni ranges, który przyjmuje zakres zamiast dwóch iteratorów.

std::vector<int> v = {3, 1, 4, 1, 5};
std::ranges::sort(v);             // sort the whole range
auto it = std::ranges::find(v, 4);

Funkcje projekcji

Algorytmy zakresów przyjmują opcjonalną projekcję — funkcję stosowaną do każdego elementu przed porównaniem. Pozwala to uniknąć pisania niestandardowych komparatorów.

struct Person { std::string name; int age; };
std::vector<Person> people;
std::ranges::sort(people, {}, &Person::age);
// sort by age, default comparison

Czym jest zakres?

Zakres to wszystko, co obsługuje begin() i end(). Są to między innymi kontenery, tablice oraz — w C++20 — dowolny typ niestandardowy udostępniający sentinel.

Sentinele

C++20 uogólnia end() do postaci sentinela, który nie musi być tego samego typu co iterator. Jest to przydatne w przypadku strumieni wejściowych i nieskończonych zakresów.

Widoki: leniwe potoki zakresów

Widok to nieposiadający własności zakres, który generuje elementy na żądanie. Widoki można łączyć za pomocą operatora potoku |.

auto squares = v
    | std::views::filter([](int x) { return x % 2 == 0; })
    | std::views::transform([](int x) { return x * x; });

for (int x : squares) std::cout << x << " ";

Leniwe obliczanie

Widoki nie alokują pamięci ani nie wykonują obliczeń, dopóki nie rozpocznie się iteracja. filter | transform | take(5) generuje tylko pierwszych 5 przekształconych wartości — nic więcej.

Zakresy pożyczane i czas życia

Widoki pożyczają swój źródłowy zakres. Jeśli źródło przestanie istnieć, widok będzie zawierać wiszące odwołania. Należy uważać na widoki oparte na obiektach tymczasowych, choć C++20 wprowadziło mechanizmy ochronne.

Wykonywanie zachłanne a leniwe

Algorytmy generują wyniki zachłannie (obliczają je od razu). Widoki są leniwe (obliczają je podczas iteracji). Należy wybrać odpowiednie rozwiązanie w zależności od tego, czy wynik ma zostać zmaterializowany.

Wydajność

Lenziwe potoki pozwalają uniknąć pośrednich kontenerów. Kompilator często optymalizuje potoki tak, jakby były pojedynczą pętlą. Aby to zweryfikować, należy sprawdzić kod w godbolt.

Ścieżka migracji

Jeśli nie mogą Państwo używać C++20, biblioteki takie jak range-v3 firmy Eric Niebler zapewniają ten sam model w C++14/17. Warto poznać je już teraz, aby ułatwić późniejszą migrację.

Szybki test

Jaka jest główna zaleta zakresów C++20 w porównaniu ze stylem STL opartym na parach iteratorów?

Podsumowanie

Zakresy C++20 unowocześniają algorytmy STL — przyjmują pojedynczy zakres, używają projekcji i umożliwiają tworzenie leniwych potoków za pomocą widoków. Operator potoku łączy filtry, transformacje i operacje take w przejrzysty, deklaratywny kod.

Często zadawane pytania

Czy lekcja „Wprowadzenie do biblioteki zakresów C++20” jest bezpłatna?

Tak — pełny tekst „Wprowadzenie do biblioteki zakresów C++20” 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 „Wprowadzenie do biblioteki zakresów C++20”?

Używaj algorytmów std::ranges, które przyjmują zakresy zamiast par iteratorów Ć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 3 z 4.

Ile czasu zajmuje lekcja „Wprowadzenie do biblioteki zakresów C++20”?

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