Namespaces
Variants

std:: strided_slice

From cppreference.net
Défini dans l'en-tête <mdspan>
template < class OffsetType, class ExtentType, class StrideType >
struct strided_slice ;
(depuis C++26)

Une instance de chaque spécialisation de strided_slice est un spécificateur de tranche utilisé dans std::submdspan pour sélectionner un sous-ensemble d'éléments en utilisant un ensemble d'indices régulièrement espacés à une dimension spécifiée dans std::mdspan .

Chaque strided_slice objet s est caractérisé par trois membres de données : l'indice de décalage s. offset , l'étendue s. extent , et le pas s. stride .

Étant donné que s. stride est supérieur à zéro, le nombre d'indices sélectionnés noté N est déterminé par 1 + ( s. extent - 1 ) / s. stride si s. extent est non nul, sinon 0 . L'intervalle semi-ouvert à partir duquel les indices seront sélectionnés est donné par [ s. offset , s. offset + s. extent ) . La séquence d'indices sélectionnés est produite comme suit : s. offset , ..., s. offset + ( N - 1 ) * s. stride .

Ce modèle de classe n'a pas de classes de base ni de membres déclarés autres que ceux indiqués ci-dessous.

Table des matières

Paramètres du modèle

OffsetType - le type de décalage
ExtentType - le type d'étendue
StrideType - le type de pas
Exigences de type
-
Tous les paramètres de template doivent être des types entiers signés ou non signés ou doivent satisfaire integral-constant-like

Le programme est mal formé si l'exigence de type n'est pas satisfaite.

Types membres

Type de membre Définition
offset_type OffsetType
extent_type ExtentType
stride_type StrideType

Membres de données

Nombre du membre Définition
offset
un index de départ de type offset_type
(objet membre public)
extent
une valeur de type extent_type ajoutée à l'offset utilisée pour définir la borne supérieure des indices
(objet membre public)
stride
une valeur d'incrément de type stride_type qui équivaut à la distance entre deux indices
(objet membre public)

Tous ces membres sont déclarés avec l'attribut [[ no_unique_address ]] et possèdent des initialiseurs de membre par défaut où chaque membre de données est initialisé par valeur.

Notes

Chaque spécialisation de strided_slice est une classe agrégée qui permet l'initialisation agrégée (y compris l'initialisation désignée) des membres de données (par exemple, std :: strided_slice { . offset = 2 , . extent = 10 , . stride = 3 } ).

La spécification de tranche de strided_slice exploite le membre de données extent , contrairement aux autres spécifications de tranche qui utilisent end pour indiquer la valeur de limite supérieure. Ceci est dû au fait qu'elle peut directement générer une étendue statique pour la sous-vue de std::mdspan si à la fois extent et stride sont de types satisfaisant integral-constant-like . Cela permet une extraction efficace de sous-vues avec des étendues statiques en mélangeant des valeurs de compilation avec une valeur d'exécution de offset .

Exemple

#include <mdspan>
#include <print>
template <typename View, typename O = int, typename E = int, typename S = int>
    requires (View::extents_type::rank() == 1)
void print_sliced_view(View v, std::strided_slice<O, E, S> s)
{
    using index_type = View::index_type;
    auto subview = std::submdspan(v, s);
    const auto& submap = subview.mapping();
    std::print("[");
    bool uses_comma = false;
    for (index_type i = 0; i != subview.extent(0); ++i)
    {
        if (uses_comma)
            std::print(", ");
        std::print("{}", subview[i]);
        uses_comma = true;
    }
    uses_comma = false;
    std::print("] extrait des indices [");
    for (index_type i = 0; i != subview.extent(0); ++i)
    {
        if (uses_comma)
            std::print(", ");
        std::print("{}", submap(i) + s.offset);
        uses_comma = true;
    }
    std::println("]");
}
int main()
{
    static constexpr char letters[]
    {
        'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
        'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
        'U', 'V', 'W', 'X', 'Y', 'Z'
    };
    constexpr std::mdspan md(letters, 26);
    print_sliced_view(md, {.offset = 0, .extent = 10, .stride = 1});
    print_sliced_view(md, {.offset = 2, .extent = 10, .stride = 1});
    print_sliced_view(md, {.offset = 0, .extent = 5,  .stride = 1});
    print_sliced_view(md, {.offset = 2, .extent = 5,  .stride = 1});
    print_sliced_view(md, {.offset = 0, .extent = 10, .stride = 2});
    print_sliced_view(md, {.offset = 2, .extent = 10, .stride = 3});
    print_sliced_view(md, {.offset = 0, .extent = 15, .stride = 5});
    print_sliced_view(md, {.offset = 6, .extent = 15, .stride = 5});
}

Sortie :

[A, B, C, D, E, F, G, H, I, J] extrait des indices [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[C, D, E, F, G, H, I, J, K, L] extrait des indices [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
[A, B, C, D, E] extrait des indices [0, 1, 2, 3, 4]
[C, D, E, F, G] extrait des indices [2, 3, 4, 5, 6]
[A, C, E, G, I] extrait des indices [0, 2, 4, 6, 8]
[C, F, I, L] extrait des indices [2, 5, 8, 11]
[A, F, K] extrait des indices [0, 5, 10]
[G, L, Q] extrait des indices [6, 11, 16]

Voir aussi

Tranche de type BLAS d'un valarray : index de départ, longueur, pas
(classe)
(C++26)
retourne une vue d'un sous-ensemble d'un mdspan existant
(modèle de fonction)