std:: span
|
Défini dans l'en-tête
<span>
|
||
|
template
<
class
T,
|
(depuis C++20) | |
Le modèle de classe
span
décrit un objet qui peut référencer une séquence contiguë d'objets avec le premier élément de la séquence à la position zéro. Un
span
peut avoir une étendue
statique
, auquel cas le nombre d'éléments dans la séquence est connu à la compilation et encodé dans le type, ou une étendue
dynamique
.
Pour un
span
s
, les pointeurs, itérateurs et références vers les éléments de
s
sont invalidés lorsqu'une opération invalide un pointeur dans l'intervalle
[
s.
data
(
)
,
s.
data
(
)
+
s.
size
(
)
)
.
|
Chaque spécialisation de
|
(depuis C++23) |
Table des matières |
Paramètres du modèle
| T | - | type d'élément ; doit être un type d'objet complet qui n'est pas un type de classe abstraite |
| Extent | - |
le nombre d'éléments dans la séquence, ou
std::dynamic_extent
si dynamique
|
Types imbriqués
| Type | Définition |
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]
|
défini par l'implémentation
LegacyRandomAccessIterator
,
ConstexprIterator
, et
contiguous_iterator
dont le
value_type
est
value_type
|
const_iterator
(depuis C++23)
|
std:: const_iterator < iterator > |
reverse_iterator
|
std:: reverse_iterator < iterator > |
const_reverse_iterator
(depuis C++23)
|
std:: const_iterator < reverse_iterator > |
-
↑
iteratorest un itérateur mutable siTn'est pas qualifié const.
Toutes les exigences relatives aux types d'itérateurs d'un
Container
s'appliquent également au type
iterator
de
span
.
Membres de données
| Membre | Description |
|
constexpr
std::
size_t
extent
[static]
|
Extent
(constante de membre public static) |
pointer
data_
|
un pointeur vers la séquence sous-jacente
( objet membre d'exposition uniquement* ) |
size_type
size_
(présent uniquement si l'extent est dynamic ) |
le nombre d'éléments
( objet membre d'exposition uniquement* ) |
Fonctions membres
construit un
span
(fonction membre publique) |
|
assigne un
span
(fonction membre publique) |
|
|
(destructor)
(implicitly declared)
|
détruit un
span
(fonction membre publique) |
Itérateurs |
|
|
(C++23)
|
retourne un itérateur vers le début
(fonction membre publique) |
|
(C++23)
|
retourne un itérateur vers la fin
(fonction membre publique) |
|
(C++23)
|
retourne un itérateur inverse vers le début
(fonction membre publique) |
|
(C++23)
|
retourne un itérateur inverse vers la fin
(fonction membre publique) |
Accès aux éléments |
|
|
accède au premier élément
(fonction membre publique) |
|
|
accède au dernier élément
(fonction membre publique) |
|
|
(C++26)
|
accède à l'élément spécifié avec vérification des limites
(fonction membre publique) |
|
accède à l'élément spécifié
(fonction membre publique) |
|
|
accès direct au stockage contigu sous-jacent
(fonction membre publique) |
|
Observateurs |
|
|
retourne le nombre d'éléments
(fonction membre publique) |
|
|
retourne la taille de la séquence en octets
(fonction membre publique) |
|
|
vérifie si la séquence est vide
(fonction membre publique) |
|
Sous-vues |
|
obtient un sous-span constitué des premiers
N
éléments de la séquence
(fonction membre publique) |
|
obtient un sous-span constitué des derniers
N
éléments de la séquence
(fonction membre publique) |
|
|
obtient un sous-span
(fonction membre publique) |
|
Fonctions non membres
|
(C++20)
|
convertit un
span
en une vue de ses octets sous-jacents
(modèle de fonction) |
Constante d'assistance
|
(C++20)
|
une constante de type
std::size_t
indiquant que le
span
a une étendue dynamique
(constante) |
Modèles d'assistance
|
template
<
class
T,
std::
size_t
Extent
>
constexpr bool ranges:: enable_borrowed_range < std :: span < T, Extent >> = true ; |
(depuis C++20) | |
Cette spécialisation de
ranges::enable_borrowed_range
permet à
span
de satisfaire
borrowed_range
.
|
template
<
class
T,
std::
size_t
Extent
>
constexpr bool ranges:: enable_view < std :: span < T, Extent >> = true ; |
(depuis C++20) | |
Cette spécialisation de
ranges::enable_view
permet à
span
de satisfaire
view
.
Guides de déduction
Notes
Les spécialisations de
std::span
sont déjà des types trivialement copiables dans toutes les implémentations existantes, même avant l'exigence formelle introduite en C++23.
| Macro de test de fonctionnalité | Valeur | Std | Fonctionnalité |
|---|---|---|---|
__cpp_lib_span
|
202002L
|
(C++20) |
std::span
|
202311L
|
(C++26) | std::span::at | |
__cpp_lib_span_initializer_list
|
202311L
|
(C++26) |
Construction de
std::span
à partir d'un
std::initializer_list
|
Exemple
L'exemple utilise
std::span
pour implémenter certains algorithmes sur des plages contiguës.
#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}) ); }
Sortie :
0 1 2 3 4 5 1 2 3 4 5 6 2 3 4 5 6 7 3 4 5 6 7 8
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Applicable à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| LWG 3203 | C++20 |
il n'était pas clair quand les pointeurs, itérateurs et
références aux éléments du
span
étaient invalidés
|
clarifié |
| LWG 3903 | C++20 |
la déclaration du destructeur du
span
était inutile
|
suppression de la déclaration |
| P2325R3 | C++20 |
un
span
avec des étendues statiques non nulles n'était pas une
view
|
tout
span
est une
view
|
Voir aussi
|
(C++23)
|
une vue de tableau multidimensionnelle non propriétaire
(modèle de classe) |
|
(C++20)
|
combine une paire itérateur-sentinelle en une
view
(modèle de classe) |
|
(C++11)
|
référence un tableau temporaire créé dans
l'initialisation de liste
(modèle de classe) |
|
(C++17)
|
vue de chaîne en lecture seule
(modèle de classe) |