Skicka span till funktioner
Skriv flexibla API:er
Skicka span till funktioner är en gratis lektion i C++ Academy på CoddyKit. Detta är lektion 3 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för C++ Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C++ Academy innehåller totalt 4 lektioner.
En funktion, många behållare
En funktion som tar emot std::span accepterar både arrayer, vektorer och råa buffertar utan att mallar eller överlagringar behövs.
#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 storleksparameter behövs
Äldre API:er i C-stil skickar en pekare och en separat storlek. En span samlar båda i ett och eliminerar fel som beror på längder som inte stämmer överens.
#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 för skrivskyddad åtkomst
Använd std::span<const T> för att lova att funktionen inte ändrar anroparens 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
}Föränderlig span för ändringar på plats
En span som inte är const låter en funktion ändra anroparens element direkt.
#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
}Undviker mallkodsexpansion
Utan span skulle du kunna använda en mall för behållartypen, vilket genererar många instansieringar. En span ger en konkret funktionssignatur som fungerar direkt.
Undviker kopior
När du skickar en span kopieras aldrig elementen. Endast en pekare och en längd skickas till 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
}Tomma span är helt okej
En funktion bör hantera en tom span på ett bra sätt. size() är noll och den range-baserade loopen körs helt enkelt noll gånger.
#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
}Skicka med värdesemantik
Span är små, så skicka dem med värdesemantik, inte som referenser. Att kopiera en pekare och en längd kostar i praktiken ingenting.
Dokumentera avsikten med const
Genom att välja span<const T> eller span<T> visar du direkt för anroparna om deras data kan ändras.
Anroparen behåller ägarskapet
Anroparen äger fortfarande behållaren. Spanen lånar den endast under anropet. Funktionen får inte lagra spanen efter att anropet har avslutats.
En modern API-stil
Att ta emot en span är det idiomatiska moderna sättet att skriva funktioner för sammanhängande data: flexibelt, säkert och utan kopiering.
Snabb kontroll
Kontrollera att du har förstått hur span skickas till funktioner.
Sammanfattning
Du har lärt dig att skicka span till funktioner:
- En enda signatur accepterar arrayer, vektorer och buffertar.
span<const T>för skrivskyddad åtkomst ochspan<T>för att ändra data på plats.- Skicka med värdesemantik, så kopieras ingenting.
- Anroparen behåller ägarskapet. Lagra inte spanen efter anropet.
Lär dig C++ med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 51
- Lektioner
- 203
Vanliga frågor
Är lektionen ”Skicka span till funktioner” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen C++ Academy, inklusive ”Skicka span till funktioner”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i C++ Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Skicka span till funktioner”?
Skriv flexibla API:er Ni övar på C++ Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig C++ Academy?
Du behöver inga förkunskaper. Utbildningen i C++ Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.
Hur lång tid tar lektionen ”Skicka span till funktioner”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här C++ Academy-lektionen?
Ja. Varje C++ Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- std::array med fast storlek
- Grunderna i std::span
- Skicka span till funktioner
- Gränser och subspan