C++ Academy · Lekcja

Przekazywanie spanów do funkcji

Pisz elastyczne API

Lekcja 3 z 413 kroki

Przekazywanie spanów do funkcji 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.

Jedna funkcja, wiele kontenerów

Funkcja przyjmująca std::span akceptuje zarówno tablice, vectory, jak i zwykłe bufory — bez potrzeby używania szablonów ani przeciążonych funkcji.

#include <iostream>
#include <span>
#include <vector>
#include <array>
int sum(std::span<const int> s) {
    int t = 0; for (int x : s) t += x; return t;
}
int main() {
    std::vector<int> v = {1, 2, 3};
    std::array<int, 2> a = {4, 5};
    std::cout << sum(v) << " " << sum(a) << "\n";
}

Nie potrzeba parametru rozmiaru

Stare interfejsy w stylu C przekazują wskaźnik oraz osobny rozmiar. Span łączy oba te elementy, eliminując błędy wynikające z niezgodnych długości.

#include <iostream>
#include <span>
void printAll(std::span<const int> s) {
    for (int x : s) std::cout << x << " ";
    std::cout << "\n";
}
int main() {
    int buf[] = {7, 8, 9};
    printAll(buf); // size inferred
}

const span do odczytu

Należy użyć std::span<const T>, aby zagwarantować, że funkcja nie zmodyfikuje danych osoby wywołującej.

#include <iostream>
#include <span>
int maxOf(std::span<const int> s) {
    int m = s[0];
    for (int x : s) if (x > m) m = x;
    return m;
}
int main() {
    int data[] = {3, 9, 4};
    std::cout << maxOf(data) << "\n"; // 9
}

Modyfikowalny span do edycji w miejscu

Span niebędący const pozwala funkcji bezpośrednio modyfikować elementy należące do osoby wywołującej.

#include <iostream>
#include <span>
#include <vector>
void doubleAll(std::span<int> s) {
    for (int& x : s) x *= 2;
}
int main() {
    std::vector<int> v = {1, 2, 3};
    doubleAll(v);
    std::cout << v[2] << "\n"; // 6
}

Mniej rozrostu kodu szablonów

Bez spanu można by utworzyć szablon zależny od typu kontenera, co generowałoby wiele instancji. Span zapewnia jeden konkretny podpis funkcji, który po prostu działa.

Brak kopii

Przekazanie spanu nigdy nie kopiuje elementów — do funkcji trafiają tylko wskaźnik i długość.

#include <iostream>
#include <span>
#include <vector>
size_t count(std::span<const int> s) { return s.size(); }
int main() {
    std::vector<int> big(1000, 0);
    std::cout << count(big) << "\n"; // no copy of 1000 ints
}

Puste spany są prawidłowe

Funkcja powinna poprawnie obsługiwać pusty span; size() wynosi zero, a pętla for oparta na zakresie wykona się dokładnie zero razy.

#include <iostream>
#include <span>
int sum(std::span<const int> s) { int t = 0; for (int x : s) t += x; return t; }
int main() {
    std::span<const int> empty;
    std::cout << sum(empty) << "\n"; // 0
}

Przekazywanie przez wartość

Spany są niewielkie, dlatego należy przekazywać je przez wartość, a nie przez referencję. Kopiowanie wskaźnika i długości jest praktycznie bezkosztowe.

Jawne określanie zamiaru użycia const

Wybór między span<const T> a span<T> od razu informuje osoby wywołujące, czy ich dane mogą zostać zmodyfikowane.

Osoba wywołująca zachowuje własność

Kontener nadal należy do osoby wywołującej; span tylko go pożycza na czas wywołania. Funkcja nie może przechowywać spanu po zakończeniu wywołania.

Nowoczesny styl interfejsu API

Przyjmowanie spanu to idiomatyczny, nowoczesny sposób pisania funkcji operujących na ciągłych danych: elastyczny, bezpieczny i niewymagający kopiowania.

Szybkie sprawdzenie

Proszę sprawdzić zrozumienie przekazywania spanów.

Podsumowanie

Poznali Państwo sposób przekazywania spanów do funkcji:

  • Jeden podpis funkcji akceptuje tablice, vectory i bufory.
  • span<const T> służy do odczytu, a span<T> do modyfikowania danych w miejscu.
  • Przekazywanie przez wartość nie kopiuje żadnych danych.
  • Osoba wywołująca zachowuje własność; nie należy przechowywać spanu po zakończeniu wywołania.
Bezpłatny start

Ucz się C++ dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
51
Lekcje
203

Często zadawane pytania

Czy lekcja „Przekazywanie spanów do funkcji” jest bezpłatna?

Tak — pełny tekst „Przekazywanie spanów do funkcji” 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 „Przekazywanie spanów do funkcji”?

Pisz elastyczne API Ć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 „Przekazywanie spanów do funkcji”?

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. std::array o stałym rozmiarze
  2. Podstawy std::span
  3. Przekazywanie spanów do funkcji
  4. Zakresy i podspany
← Powrót do C++ Academy