std:: strided_slice
|
Definiert im 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 eines Satzes regelmäßig beabstandeter Indizes in einer bestimmten Dimension von
std::mdspan
auszuwählen.
Jedes
strided_slice
-Objekt
s
ist durch drei Datenmember charakterisiert: den Offset-Index
s.
offset
, die Extent
s.
extent
und den Stride
s.
stride
.
Vorausgesetzt, dass
s.
stride
größer als null ist, wird die Anzahl der ausgewählten Indizes, bezeichnet mit
N
, bestimmt durch
1
+
(
s.
extent
-
1
)
/
s.
stride
falls
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 Folge der ausgewählten Indizes wird wie folgt erzeugt:
s.
offset
, ..., s.
offset
+
(
N
-
1
)
*
s.
stride
.
Diese Klassenvorlage hat keine Basisklassen oder deklarierten Member außer den unten gezeigten.
Inhaltsverzeichnis |
Template-Parameter
| OffsetType | - | der Typ des Offsets |
| ExtentType | - | der Typ der Extent |
| StrideType | - | der Typ der Stride |
| Typanforderungen | ||
|
-
|
||
Das Programm ist fehlerhaft, wenn die Typanforderung nicht erfüllt ist.
Mitgliedertypen
| Mitgliedertyp | Definition |
offset_type
|
OffsetType
|
extent_type
|
ExtentType
|
stride_type
|
StrideType
|
Datenmitglieder
| Mitgliedername | 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 dem Abstand zwischen zwei Indizes entspricht
(öffentliches Mitgliedsobjekt) |
Alle diese Member sind mit dem
[[
no_unique_address
]]
-Attribut deklariert und verfügen über Standard-Member-Initialisierer, bei denen jedes Datenmember wertinitialisiert wird.
Hinweise
Jede Spezialisierung von
strided_slice
ist eine Aggregatklasse, die
Aggregatinitialisierung
(einschließlich Designated Initialization) von Datenelementen ermöglicht (zum Beispiel
std
::
strided_slice
{
.
offset
=
2
, .
extent
=
10
, .
stride
=
3
}
).
Die Slice-Spezifikation von
strided_slice
nutzt das Datenmitglied
extent
, im Gegensatz zu anderen Slice-Spezifikationen, die
end
verwenden, um den oberen Grenzwert anzugeben. Dies liegt daran, dass es direkt eine statische Ausdehnung für die Teilansicht von
std::mdspan
erzeugen kann, wenn sowohl
extent
als auch
stride
Typen sind, die
integral-constant-like
erfüllen. Dies ermöglicht die effiziente Extraktion von Teilansichten mit statischen Ausdehnungen durch die Kombination von Kompilierzeitwerten mit einem Laufzeitwert von
offset
.
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("] extrahiert aus Indizes ["); 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] extrahiert aus Indizes [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [C, D, E, F, G, H, I, J, K, L] extrahiert aus Indizes [2, 3, 4, 5, 6, 7, 8, 9, 10, 11] [A, B, C, D, E] extrahiert aus Indizes [0, 1, 2, 3, 4] [C, D, E, F, G] extrahiert aus Indizes [2, 3, 4, 5, 6] [A, C, E, G, I] extrahiert aus Indizes [0, 2, 4, 6, 8] [C, F, I, L] extrahiert aus Indizes [2, 5, 8, 11] [A, F, K] extrahiert aus Indizes [0, 5, 10] [G, L, Q] extrahiert aus Indizes [6, 11, 16]
Siehe auch
|
BLAS-ähnlicher Ausschnitt eines valarray: Startindex, Länge, Schrittweite
(Klasse) |
|
|
(C++26)
|
gibt eine Ansicht eines Teils eines bestehenden
mdspan
zurück
(Funktionstemplate) |