Namespaces
Variants

std:: span

From cppreference.net
Défini dans l'en-tête <span>
template <

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

> class span ;
(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 std::span est un type TriviallyCopyable .

(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 >
  1. iterator est un itérateur mutable si T n'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
retourne un itérateur vers le début
(fonction membre publique)
(C++23)
retourne un itérateur vers la fin
(fonction membre publique)
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

convertit un span en une vue de ses octets sous-jacents
(modèle de fonction)

Constante d'assistance

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)
combine une paire itérateur-sentinelle en une view
(modèle de classe)
référence un tableau temporaire créé dans l'initialisation de liste
(modèle de classe)
vue de chaîne en lecture seule
(modèle de classe)