Ugrás a tartalomhoz

std::span

A Wikiszótárból, a nyitott szótárból


Főnév

std::span (tsz. std::spans)

  1. (informatika) A **std::span** a C++20 újdonsága, amely egy nem birtokló nézet egy tömbre vagy tömbszerű adatszerkezetre. Lehetővé teszi, hogy biztonságosan és hatékonyan hozzáférj egy adathalmaz részéhez anélkül, hogy azt lemásolnád – ez a modern C++ slicing és view megoldása.



🧠 TL;DR – Mi az a std::span?

std::span<T> = "ablak" egy tömbre vagy tömbszerű objektumra.
  • Nem birtokol memóriát – csak néz egy létező memóriaterületre.
  • Hatékony, nulla másolás.
  • Bármilyen tömböt, std::array-t, std::vector-t vagy pointert és méretet elfogad.



📦 Használat

1. std::span tömbre

#include <span>
#include <iostream>

void kiir(std::span<int> sp) {
    for (int x : sp)
        std::cout << x << ' ';
}

int main() {
    int tomb[] = {1, 2, 3, 4, 5};
    kiir(tomb); // automatikusan span-ná konvertálható
}

2. std::span vektorra

#include <vector>
#include <span>

std::vector<int> v = {10, 20, 30, 40, 50};
std::span<int> sp(v); // működik vektorral is

3. Slicing span-nel

int tomb[] = {10, 20, 30, 40, 50};
std::span<int> sp(tomb);

std::span<int> resz = sp.subspan(1, 3);  // 20, 30, 40

🧩 Működés alatt

Egy std::span<T> két adattagot tárol:

T* ptr;    // mutató az első elemre
size_t n;  // elemek száma

Ezáltal könnyen átadható függvényeknek úgy, hogy méret is benne van, szemben a sima T*-vel.



✅ Előnyei

Előny Részletezés
Zero-copy Nem másol adatot, csak nézetet biztosít
Méret-információval együtt Pontosan tudja, hány elemre mutat
Biztonságosabb, mint T* Nincs “size mismatch”
Alkalmas slicing-ra subspan(), first(n), last(n)
Szépen működik const-tal std::span<const int> például olvasásra



🚧 Megkötések

  • Nem tárol adatot – az eredeti adatok nem élhetnek kevesebb ideig, mint a span.
  • A std::vector kapacitásbővítése érvényteleníti a hozzá kapcsolt spant.
  • C++20 szükséges, vagy implementációfüggő <experimental/span> (pl. MSVC-ben korábban is elérhető).



📌 Függvények

sp.size();           // hány elem
sp.empty();          // üres-e
sp.data();           // nyers pointer
sp.front(), sp.back()
sp.subspan(i, n);    // slicing
sp.first(n), sp.last(n)

🔐 Példa – slicing és használat

#include <span>
#include <iostream>
#include <vector>

void dolgoz(std::span<int> adat) {
    auto kozep = adat.subspan(1, 3);
    for (int x : kozep)
        std::cout << x << ' ';
}

int main() {
    std::vector<int> v = {10, 20, 30, 40, 50};
    dolgoz(v); // 20 30 40
}

🧠 Statikus méretű span

std::span<int, 5> fixMeretuSpan(tomb);  // csak 5 elemű tömbbel működik

Hasznos metaprogramozáshoz vagy fix API-kontraktusokhoz.



🧪 Összefoglalás

Tulajdonság Leírás
Nem birtokló Csak néz adatot
Hatékony Nincs másolás
Biztonságosabb Méretet is visz
Slicing-képes subspan() stb.
Modern C++20-tól



🔚 Zárszó

A std::span tökéletes eszköz akkor, ha egy függvénynek tömbre vagy tömbszerű adatra nézetet akarunk adni – legyen az int[], std::array, std::vector, vagy akár nyers pointer és méret.