std:: span
|
Definiert im Header
<span>
|
||
|
template
<
class
T,
|
(seit C++20) | |
Die Klassenvorlage
span
beschreibt ein Objekt, das sich auf eine zusammenhängende Folge von Objekten beziehen kann, wobei sich das erste Element der Folge an Position null befindet. Ein
span
kann entweder eine
static
Ausdehnung haben, wobei die Anzahl der Elemente in der Folge zur Kompilierzeit bekannt und im Typ kodiert ist, oder eine
dynamic
Ausdehnung.
Für einen
span
s
werden Zeiger, Iteratoren und Referenzen auf Elemente von
s
ungültig, wenn eine Operation einen Zeiger im Bereich
[
s.
data
(
)
,
s.
data
(
)
+
s.
size
(
)
)
ungültig macht.
|
Jede Spezialisierung von
|
(seit C++23) |
Inhaltsverzeichnis |
Template-Parameter
| T | - | Elementtyp; muss ein vollständiger Objekttyp sein, der kein abstrakter Klassentyp ist |
| Extent | - |
die Anzahl der Elemente in der Sequenz, oder
std::dynamic_extent
falls dynamisch
|
Verschachtelte Typen
| Typ | Definition |
element_type
|
T
|
value_type
|
std:: remove_cv_t < T > |
size_type
|
std::size_t |
difference_type
|
std::ptrdiff_t |
pointer
|
T * |
const_pointer
|
const T * |
reference
|
T & |
const_reference
|
const T & |
iterator
[1]
|
implementierungsdefiniert
LegacyRandomAccessIterator
,
ConstexprIterator
, und
contiguous_iterator
, dessen
value_type
value_type
ist
|
const_iterator
(seit C++23)
|
std:: const_iterator < iterator > |
reverse_iterator
|
std:: reverse_iterator < iterator > |
const_reverse_iterator
(seit C++23)
|
std:: const_iterator < reverse_iterator > |
-
↑
iteratorist ein veränderlicher Iterator, fallsTnicht const-qualifiziert ist.
Alle Anforderungen an die Iteratortypen eines
Container
gelten ebenfalls für den
iterator
-Typ von
span
.
Datenmitglieder
| Mitglied | Beschreibung |
|
constexpr
std::
size_t
extent
[static]
|
Extent
(öffentliche statische Member-Konstante) |
pointer
data_
|
ein Zeiger auf die zugrundeliegende Sequenz
( Nur zur Darstellung verwendetes Member-Objekt* ) |
size_type
size_
(nur vorhanden, wenn die Ausdehnung dynamisch ist) |
die Anzahl der Elemente
( Nur zur Darstellung verwendetes Member-Objekt* ) |
Memberfunktionen
konstruiert einen
span
(öffentliche Elementfunktion) |
|
weist einen
span
zu
(öffentliche Elementfunktion) |
|
|
(Destruktor)
(implizit deklariert)
|
zerstört einen
span
(öffentliche Elementfunktion) |
Iteratoren |
|
|
(C++23)
|
gibt einen Iterator zum Anfang zurück
(öffentliche Elementfunktion) |
|
(C++23)
|
gibt einen Iterator zum Ende zurück
(öffentliche Elementfunktion) |
|
(C++23)
|
gibt einen Reverse-Iterator zum Anfang zurück
(öffentliche Elementfunktion) |
|
(C++23)
|
gibt einen Reverse-Iterator zum Ende zurück
(öffentliche Elementfunktion) |
Elementzugriff |
|
|
greift auf das erste Element zu
(öffentliche Elementfunktion) |
|
|
greift auf das letzte Element zu
(öffentliche Elementfunktion) |
|
|
(C++26)
|
greift auf ein bestimmtes Element mit Bereichsprüfung zu
(öffentliche Elementfunktion) |
|
greift auf ein bestimmtes Element zu
(öffentliche Elementfunktion) |
|
|
direkter Zugriff auf den zugrundeliegenden zusammenhängenden Speicher
(öffentliche Elementfunktion) |
|
Beobachter |
|
|
gibt die Anzahl der Elemente zurück
(öffentliche Elementfunktion) |
|
|
gibt die Größe der Sequenz in Bytes zurück
(öffentliche Elementfunktion) |
|
|
prüft, ob die Sequenz leer ist
(öffentliche Elementfunktion) |
|
Teilansichten |
|
erhält eine Teilansicht, die aus den ersten
N
Elementen der Sequenz besteht
(öffentliche Elementfunktion) |
|
erhält eine Teilansicht, die aus den letzten
N
Elementen der Sequenz besteht
(öffentliche Elementfunktion) |
|
|
erhält eine Teilansicht
(öffentliche Elementfunktion) |
|
Nicht-Member-Funktionen
|
(C++20)
|
wandelt einen
span
in eine Ansicht seiner zugrundeliegenden Bytes um
(Funktions-Template) |
Hilfskonstante
|
(C++20)
|
eine Konstante vom Typ
std::size_t
, die anzeigt, dass die
span
eine dynamische Ausdehnung besitzt
(Konstante) |
Hilfsvorlagen
|
template
<
class
T,
std::
size_t
Extent
>
constexpr bool ranges:: enable_borrowed_range < std :: span < T, Extent >> = true ; |
(seit C++20) | |
Diese Spezialisierung von
ranges::enable_borrowed_range
bewirkt, dass
span
die Anforderungen von
borrowed_range
erfüllt.
|
template
<
class
T,
std::
size_t
Extent
>
constexpr bool ranges:: enable_view < std :: span < T, Extent >> = true ; |
(seit C++20) | |
Diese Spezialisierung von
ranges::enable_view
bewirkt, dass
span
die Anforderungen von
view
erfüllt.
Deduktionshilfen
Hinweise
Spezialisierungen von
std::span
sind bereits in allen existierenden Implementierungen trivial kopierbare Typen, sogar vor der formalen Anforderung, die in C++23 eingeführt wurde.
| Feature-Test Makro | Wert | Standard | Funktion |
|---|---|---|---|
__cpp_lib_span
|
202002L
|
(C++20) |
std::span
|
202311L
|
(C++26) | std::span::at | |
__cpp_lib_span_initializer_list
|
202311L
|
(C++26) |
Konstruktion von
std::span
aus einem
std::initializer_list
|
Beispiel
Das Beispiel verwendet
std::span
, um einige Algorithmen auf zusammenhängenden Bereichen zu implementieren.
#include <algorithm> #include <cstddef> #include <iostream> #include <span> template<class T, std::size_t N> [[nodiscard]] constexpr auto slide(std::span<T, N> s, std::size_t offset, std::size_t width) { return s.subspan(offset, offset + width <= s.size() ? width : 0U); } template<class T, std::size_t N, std::size_t M> constexpr bool starts_with(std::span<T, N> data, std::span<T, M> prefix) { return data.size() >= prefix.size() && std::equal(prefix.begin(), prefix.end(), data.begin()); } template<class T, std::size_t N, std::size_t M> constexpr bool ends_with(std::span<T, N> data, std::span<T, M> suffix) { return data.size() >= suffix.size() && std::equal(data.end() - suffix.size(), data.end(), suffix.end() - suffix.size()); } template<class T, std::size_t N, std::size_t M> constexpr bool contains(std::span<T, N> span, std::span<T, M> sub) { return std::ranges::search(span, sub).begin() != span.end(); } void println(const auto& seq) { for (const auto& elem : seq) std::cout << elem << ' '; std::cout << '\n'; } int main() { constexpr int a[]{0, 1, 2, 3, 4, 5, 6, 7, 8}; constexpr int b[]{8, 7, 6}; constexpr static std::size_t width{6}; for (std::size_t offset{}; ; ++offset) if (auto s = slide(std::span{a}, offset, width); !s.empty()) println(s); else break; static_assert("" && starts_with(std::span{a}, std::span{a, 4}) && starts_with(std::span{a + 1, 4}, std::span{a + 1, 3}) && !starts_with(std::span{a}, std::span{b}) && !starts_with(std::span{a, 8}, std::span{a + 1, 3}) && ends_with(std::span{a}, std::span{a + 6, 3}) && !ends_with(std::span{a}, std::span{a + 6, 2}) && contains(std::span{a}, std::span{a + 1, 4}) && !contains(std::span{a, 8}, std::span{a, 9}) ); }
Ausgabe:
0 1 2 3 4 5 1 2 3 4 5 6 2 3 4 5 6 7 3 4 5 6 7 8
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 3203 | C++20 |
Es war unklar, wann Zeiger, Iteratoren und
Referenzen auf Elemente von
span
ungültig werden
|
Klarstellung vorgenommen |
| LWG 3903 | C++20 |
Die Deklaration des Destruktors von
span
war unnötig
|
Deklaration entfernt |
| P2325R3 | C++20 |
Ein
span
mit nicht-null statischer Ausdehnung war kein
view
|
Jeder
span
ist ein
view
|
Siehe auch
|
(C++23)
|
eine mehrdimensionale nicht-besitzende Array-Ansicht
(Klassentemplate) |
|
(C++20)
|
kombiniert ein Iterator-Sentinel-Paar zu einer
view
(Klassentemplate) |
|
(C++11)
|
referenziert ein temporäres Array, das in
Listeninitialisierung
erstellt wurde
(Klassentemplate) |
|
(C++17)
|
schreibgeschützte String-Ansicht
(Klassentemplate) |