Videregivelse af spans til funktioner
Skriv fleksible API'er
Videregivelse af spans til funktioner er en gratis C++ Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i C++ Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C++ Academy-kurset indeholder 4 lektioner i alt.
Én funktion, mange containere
En funktion, der tager std::span, accepterer både arrays, vektorer og rå buffere uden behov for templates eller overloads.
#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";
}Ingen størrelsesparameter nødvendig
Gamle API'er i C-stil videregiver en pointer samt en separat størrelse. En span samler begge dele og fjerner fejl på grund af uoverensstemmende længder.
#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 til skrivebeskyttet adgang
Brug std::span<const T> til at angive, at funktionen ikke ændrer kalders data.
#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
}Mutable span til ændring på stedet
En span, der ikke er const, lader en funktion ændre kalders elementer direkte.
#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
}Undgår template-eksplosion
Uden span kunne du bruge en template-parametrisering efter containertypen, hvilket genererer mange instansieringer. En span giver én konkret signatur, der bare virker.
Undgår kopiering
Når du videregiver en span, kopieres elementerne aldrig; kun en pointer og en længde sendes ind i funktionen.
#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
}Tomme spans er helt i orden
En funktion bør håndtere en tom span korrekt; size() er nul, og den rangebaserede løkke kører ganske enkelt nul gange.
#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
}Videregiv som værdi
Spans er små, så videregiv dem som værdi, ikke som reference. Det er stort set gratis at kopiere en pointer og en længde.
Dokumentér hensigten med const
Valget mellem span<const T> og span<T> fortæller kaldere med et blik, om deres data må ændres.
Kaldersiden bevarer ejerskabet
Kalderen ejer stadig containeren; spannen låner den kun under kaldet. Funktionen må ikke gemme spannen efter kaldet.
En moderne API-stil
At acceptere en span er den idiomatiske, moderne måde at skrive funktioner over sammenhængende data på: fleksibel, sikker og uden kopiering.
Hurtig kontrol
Kontrollér din forståelse af at videregive spans.
Opsummering
Du har lært at videregive spans til funktioner:
- Én signatur accepterer arrays, vektorer og buffere.
span<const T>til skrivebeskyttet adgang;span<T>til ændring på stedet.- Videregiv som værdi; intet kopieres.
- Kalderen bevarer ejerskabet; gem ikke spannen efter kaldet.
Lær C++ med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 51
- Lektioner
- 203
Ofte stillede spørgsmål
Er lektionen “Videregivelse af spans til funktioner” gratis?
Ja — alle 3 lektioner i læringssporet C++ Academy, inklusive “Videregivelse af spans til funktioner”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. C++ Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Videregivelse af spans til funktioner”?
Skriv fleksible API'er Du øver dig i C++ Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på C++ Academy?
Der kræves ingen tidligere erfaring. C++ Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.
Hvor lang tid tager lektionen “Videregivelse af spans til funktioner”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne C++ Academy-lektion?
Ja. Alle C++ Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- std::array med fast størrelse
- Grundlæggende om std::span
- Videregivelse af spans til funktioner
- Grænser og subspans