Przekazywanie spanów do funkcji
Pisz elastyczne API
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, aspan<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.
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
- std::array o stałym rozmiarze
- Podstawy std::span
- Przekazywanie spanów do funkcji
- Zakresy i podspany