Namespaces
Variants

std:: span

From cppreference.net
Definiert im Header <span>
template <

class T,
std:: size_t Extent = std:: dynamic_extent

> class span ;
(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 std::span ist ein TriviallyCopyable Typ.

(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 >
  1. iterator ist ein veränderlicher Iterator, falls T nicht 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
gibt einen Iterator zum Anfang zurück
(öffentliche Elementfunktion)
(C++23)
gibt einen Iterator zum Ende zurück
(öffentliche Elementfunktion)
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

wandelt einen span in eine Ansicht seiner zugrundeliegenden Bytes um
(Funktions-Template)

Hilfskonstante

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)
kombiniert ein Iterator-Sentinel-Paar zu einer view
(Klassentemplate)
referenziert ein temporäres Array, das in Listeninitialisierung erstellt wurde
(Klassentemplate)
schreibgeschützte String-Ansicht
(Klassentemplate)