Namespaces
Variants

std:: strided_slice

From cppreference.net
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
-
Alle Template-Parameter müssen vorzeichenbehaftete oder vorzeichenlose Ganzzahltypen sein oder müssen integral-constant-like erfüllen

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)