C++ Academy · Lektion

Skicka span till funktioner

Skriv flexibla API:er

Lektion 3 av 413 steg

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 och span<T> för att ändra data på plats.
  • Skicka med värdesemantik, så kopieras ingenting.
  • Anroparen behåller ägarskapet. Lagra inte spanen efter anropet.
Gratis att börja

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

  1. std::array med fast storlek
  2. Grunderna i std::span
  3. Skicka span till funktioner
  4. Gränser och subspan
← Tillbaka till C++ Academy