std:: strided_slice
|
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 | ||
|
-
|
||
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) |