std::strided_slice
| Definiert in Header <mdspan> |
||
| template< class OffsetType, class ExtentType, class StrideType > struct strided_slice; |
(seit C++26) | |
Eine Instanz jeder Spezialisierung von strided_slice ist ein Slice-Spezifizierer, der in std::submdspan verwendet wird, um eine Teilmenge von Elementen mithilfe einer Reihe von regelmäßig beabstandeten Indizes in einer angegebenen Dimension in std::mdspan auszuwählen.
Jedes strided_slice-Objekt s wird durch drei Datenmember charakterisiert: den Offset-Index s.offset, die Ausdehnung (Extent) s.extent und den Schritt (Stride) s.stride.
Unter der Annahme, dass s.stride größer als Null ist, wird die Anzahl der ausgewählten Indizes, bezeichnet mit N, durch 1 + (s.extent - 1) / s.stride bestimmt, wenn s.extent ungleich Null ist, andernfalls 0. Das halboffene Intervall, aus dem Indizes ausgewählt werden, ist gegeben durch [s.offset, s.offset + s.extent). Die Sequenz der ausgewählten Indizes wird wie folgt erzeugt: s.offset, ..., s.offset + (N - 1) * s.stride.
Diese Klassenschablone hat keine Basisklassen oder deklarierten Member außer den unten gezeigten.
Inhalt |
[bearbeiten] Schablonenparameter
| OffsetType | - | der Typ des Offsets |
| ExtentType | - | der Typ der Ausdehnung (Extent) |
| StrideType | - | der Typ des Schritts (Stride) |
| Typanforderungen | ||
| -Alle Schablonenparameter müssen vorzeichenlose oder vorzeichenbehaftete Ganzzahltypen sein oder integral-constant-like erfüllen. | ||
Das Programm ist ill-formed, wenn die Typanforderung nicht erfüllt ist.
[bearbeiten] Member-Typen
| Mitgliedertyp | Definition |
offset_type
|
OffsetType
|
extent_type
|
ExtentType
|
stride_type
|
StrideType
|
[bearbeiten] Datenmember
| Member-Name | Definition |
| offset |
ein Startindex vom Typ offset_type(öffentliches Mitgliedsobjekt) |
| extent |
ein Wert vom Typ extent_type, der zum Offset addiert wird, um die obere Grenze der Indizes zu definieren(öffentliches Mitgliedsobjekt) |
| stride |
ein Inkrementwert vom Typ stride_type, der der Entfernung zwischen zwei Indizes entspricht(öffentliches Mitgliedsobjekt) |
Alle diese Member sind mit dem Attribut [[no_unique_address]] deklariert und haben Standard-Member-Initialisierer, bei denen jeder Datenmember wertinitialisiert ist.
[bearbeiten] Hinweise
Jede Spezialisierung von strided_slice ist eine Aggregatklasse, die Aggregatinitialisierung (einschließlich designierter Initialisierung) von Datenmembern erlaubt (z. B. std::strided_slice{.offset = 2, .extent = 10, .stride = 3}).
Die Slice-Spezifikation von strided_slice nutzt den Datenmember extent aus, im Gegensatz zu anderen Slice-Spezifikationen, die end verwenden, um den Wert der oberen Grenze anzugeben. Dies liegt daran, dass sie direkt eine statische Ausdehnung (extent) für Subviews von std::mdspan generieren kann, wenn sowohl extent als auch stride Typen sind, die integral-constant-like erfüllen. Dies ermöglicht die effiziente Extraktion von Subviews mit statischen Ausdehnungen durch die Mischung von Compile-Zeit-Werten mit einem Laufzeitwert von offset.
[bearbeiten] Beispiel
#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("] extracted from 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}); }
Ausgabe
[A, B, C, D, E, F, G, H, I, J] extracted from indices [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [C, D, E, F, G, H, I, J, K, L] extracted from indices [2, 3, 4, 5, 6, 7, 8, 9, 10, 11] [A, B, C, D, E] extracted from indices [0, 1, 2, 3, 4] [C, D, E, F, G] extracted from indices [2, 3, 4, 5, 6] [A, C, E, G, I] extracted from indices [0, 2, 4, 6, 8] [C, F, I, L] extracted from indices [2, 5, 8, 11] [A, F, K] extracted from indices [0, 5, 10] [G, L, Q] extracted from indices [6, 11, 16]
[bearbeiten] Siehe auch
| BLAS-ähnlicher Slice eines Valarrays: Startindex, Länge, Schrittweite (class) | |
| (C++26) |
gibt eine Ansicht eines Teils eines vorhandenen mdspan zurück(function template) |