std::span
Megjelenés
Főnév
std::span (tsz. std::spans)
- (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::vectorkapacitá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.