C++ Academy · Lektion

Grundlæggende om std::span

Views uden ejerskab over sammenhængende data

Lektion 2 af 413 trin

Grundlæggende om std::span er en gratis C++ Academy-lektion på CoddyKit. Dette er lektion 2 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.

En visning uden ejerskab

std::span<T> (C++20) er en letvægtsvisning over en sammenhængende sekvens, ligesom string_view, men for enhver elementtype. Inkludér <span>.

#include <iostream>
#include <span>
#include <array>
int main() {
    std::array<int, 3> a = {1, 2, 3};
    std::span<int> s = a;
    std::cout << s.size() << "\n";
}

Spans ejer ikke data

En span gemmer en pointer og en længde. Den observerer data, der ejes et andet sted, og kopierer aldrig elementerne.

#include <iostream>
#include <vector>
#include <span>
int main() {
    std::vector<int> v = {5, 6, 7};
    std::span<int> s = v;
    s[0] = 50; // modifies v
    std::cout << v[0] << "\n"; // 50
}

Fra et std::array

Et array konverteres automatisk til en span, som ser alle dets elementer.

#include <iostream>
#include <span>
#include <array>
int main() {
    std::array<int, 4> a = {1, 2, 3, 4};
    std::span<int> s{a};
    for (int x : s) std::cout << x << " ";
    std::cout << "\n";
}

Fra en vector

En std::vector konverteres også til en span, så du får en ensartet visning uanset den underliggende container.

#include <iostream>
#include <vector>
#include <span>
int main() {
    std::vector<int> v = {9, 8, 7};
    std::span<int> s = v;
    std::cout << s.front() << " " << s.back() << "\n";
}

Fra pointer og størrelse

Du kan oprette en span ud fra en rå pointer og et antal elementer, hvilket er nyttigt til buffere i C-stil.

#include <iostream>
#include <span>
int main() {
    int buf[] = {10, 20, 30};
    std::span<int> s(buf, 3);
    std::cout << s[1] << "\n"; // 20
}

Iteration over en span

Spans understøtter rangebaserede for-løkker og den sædvanlige containergrænseflade (size, front, back, data).

#include <iostream>
#include <span>
int main() {
    int buf[] = {2, 4, 6, 8};
    std::span<int> s(buf, 4);
    int sum = 0;
    for (int x : s) sum += x;
    std::cout << sum << "\n"; // 20
}

Skrivebeskyttede spans

En std::span<const int> giver skrivebeskyttet adgang. Brug den, når en funktion ikke skal ændre dataene.

#include <iostream>
#include <span>
int main() {
    int buf[] = {1, 2, 3};
    std::span<const int> s(buf, 3);
    std::cout << s[2] << "\n"; // 3
}

Ændring gennem en span

En span, der ikke er const, kan ændre de underliggende elementer, fordi den peger på de faktiske data.

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

Dynamisk eller statisk udstrækning

Som standard har en span en dynamisk størrelse, men du kan fastsætte den ved kompilering med std::span<int, 3> for at få ekstra kontrol.

Ingen allokering, billig at videregive

Som alle visninger er en span billig at kopiere og videregive som værdi, fordi den kun indeholder en pointer og en længde.

Vær opmærksom på levetiden

En span er kun gyldig, så længe dens kilde lever og ikke bliver allokeret igen. Gem ikke en span til en vector, der senere vokser.

Hurtig kontrol

Kontrollér din forståelse af std::span.

Opsummering

Du har lært det grundlæggende om std::span:

  • En visning uden ejerskab over sammenhængende data (array, vector eller rå buffer).
  • Indeholder en pointer og en længde; ingen kopiering eller allokering.
  • const-spans er skrivebeskyttede; mutable spans ændrer kilden.
  • Kun gyldig, så længe kilden lever.
Gratis at komme i gang

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 “Grundlæggende om std::span” gratis?

Ja — alle 3 lektioner i læringssporet C++ Academy, inklusive “Grundlæggende om std::span”, 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 “Grundlæggende om std::span”?

Views uden ejerskab over sammenhængende data 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 2 af 4.

Hvor lang tid tager lektionen “Grundlæggende om std::span”?

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

  1. std::array med fast størrelse
  2. Grundlæggende om std::span
  3. Videregivelse af spans til funktioner
  4. Grænser og subspans
← Tilbage til C++ Academy