Namespaces
Variants

std:: mdspan

From cppreference.net
Definiert im Header <mdspan>
template <

class T,
class Extents,
class LayoutPolicy = std:: layout_right ,
class AccessorPolicy = std:: default_accessor < T >

> class mdspan ;
(seit C++23)

std::mdspan ist eine multidimensionale Array-Ansicht, die einen multidimensionalen Index auf ein Element des Arrays abbildet. Die Abbildungs- und Elementzugriffsrichtlinien sind konfigurierbar, und das zugrundeliegende Array muss nicht zusammenhängend oder überhaupt im Speicher vorhanden sein.

Jede Spezialisierung MDS von mdspan modelliert copyable und erfüllt:

Eine Spezialisierung von mdspan ist ein TriviallyCopyable -Typ, wenn ihr accessor_type , mapping_type und data_handle_type TriviallyCopyable -Typen sind.

Inhaltsverzeichnis

Template-Parameter

T - Elementtyp; ein vollständiger Objekttyp, der weder ein abstrakter Klassentyp noch ein Array-Typ ist.
Extents - gibt die Anzahl der Dimensionen, ihre Größen und welche zur Kompilierzeit bekannt sind an. Muss eine Spezialisierung von std::extents sein.
LayoutPolicy - gibt an, wie ein mehrdimensionaler Index in einen zugrundeliegenden 1D-Index umgewandelt wird (spaltenmajor 3D-Array, symmetrische dreieckige 2D-Matrix, etc.). Muss die Anforderungen von LayoutMappingPolicy erfüllen.
AccessorPolicy - gibt an, wie ein zugrundeliegender 1D-Index in eine Referenz auf T umgewandelt wird. Muss die Bedingung erfüllen, dass std:: is_same_v < T, typename AccessorPolicy​ :: ​element_type > gleich true ist. Muss die Anforderungen von AccessorPolicy erfüllen.

Mitgliedertypen

Mitglied Definition
extents_type Extents
layout_type LayoutPolicy
accessor_type AccessorPolicy
mapping_type LayoutPolicy :: mapping < Extents >
element_type T
value_type std:: remove_cv_t < T >
index_type Extents :: index_type
size_type Extents :: size_type
rank_type Extents :: rank_type
data_handle_type AccessorPolicy :: data_handle_type
reference AccessorPolicy :: reference

Datenmitglieder

Mitglied Beschreibung
accessor_type acc_ (privat) der Accessor
( Nur zur Darstellung verwendetes Mitgliedsobjekt* )
mapping_type map_ (privat) das Layout-Mapping
( Nur zur Darstellung verwendetes Mitgliedsobjekt* )
data_handle_type ptr_ (privat) der zugrundeliegende Daten-Handle
( Nur zur Darstellung verwendetes Mitgliedsobjekt* )

Memberfunktionen

konstruiert einen mdspan
(öffentliche Elementfunktion)
weist einen mdspan zu
(öffentliche Elementfunktion)
Elementzugriff
greift auf ein Element am angegebenen mehrdimensionalen Index zu
(öffentliche Elementfunktion)
Beobachter
[static]
gibt den Rang eines mdspan zurück
(öffentliche statische Elementfunktion)
gibt den dynamischen Rang eines mdspan zurück
(öffentliche statische Elementfunktion)
gibt die statische Extent-Größe eines mdspan an einem gegebenen Rangindex zurück
(öffentliche statische Elementfunktion)
gibt den Extent eines mdspan an einem gegebenen Rangindex zurück
(öffentliche Elementfunktion)
gibt die Größe des mehrdimensionalen Indexraums zurück
(öffentliche Elementfunktion)
prüft, ob die Größe des Indexraums null ist
(öffentliche Elementfunktion)
ermittelt die Schrittweite entlang der angegebenen Dimension
(öffentliche Elementfunktion)
ermittelt das Extents-Objekt
(öffentliche Elementfunktion)
ermittelt den Zeiger auf die zugrundeliegende 1D-Sequenz
(öffentliche Elementfunktion)
ermittelt das Mapping-Objekt
(öffentliche Elementfunktion)
ermittelt das Accessor-Policy-Objekt
(öffentliche Elementfunktion)
bestimmt, ob das Mapping dieses mdspan eindeutig ist (jede Kombination von Indizes bildet auf ein anderes zugrundeliegendes Element ab)
(öffentliche Elementfunktion)
bestimmt, ob das Mapping dieses mdspan erschöpfend ist (jedes zugrundeliegende Element kann mit einer Kombination von Indizes erreicht werden)
(öffentliche Elementfunktion)
bestimmt, ob das Mapping dieses mdspan schrittweise ist (in jeder Dimension überspringt das Inkrementieren eines Index jedes Mal die gleiche Anzahl zugrundeliegender Elemente)
(öffentliche Elementfunktion)
bestimmt, ob das Layout-Mapping dieses mdspan immer eindeutig ist
(öffentliche statische Elementfunktion)
bestimmt, ob das Layout-Mapping dieses mdspan immer erschöpfend ist
(öffentliche statische Elementfunktion)
bestimmt, ob das Layout-Mapping dieses mdspan immer schrittweise ist
(öffentliche statische Elementfunktion)

Nicht-Member-Funktionen

spezialisiert den std::swap Algorithmus für mdspan
(Funktions-Template)
Subviews
(C++26)
gibt eine Ansicht eines Teils eines bestehenden mdspan zurück
(Funktions-Template)
erstellt neue Extents aus bestehenden Extents und Slice-Spezifizierern
(Funktions-Template)

Hilfstypen und Templates

(C++23)
ein Deskriptor eines mehrdimensionalen Indexraums eines bestimmten Rangs
(Klassentemplate)
(C++23) (C++26)
praktisches Alias-Template für einen vollständig dynamischen std::extents
(Alias-Template)
ein Typ für indizierten Zugriff auf Elemente von mdspan
(Klassentemplate)
ein Typ für ausgerichteten Zugriff auf Elemente von mdspan
(Klassentemplate)
Layout-Mapping-Strategien
spaltenorientierte mehrdimensionale Array-Layout-Mapping-Strategie; linkste Dimension hat Stride 1
(Klasse)
zeilenorientierte mehrdimensionale Array-Layout-Mapping-Strategie; rechteste Dimension hat Stride 1
(Klasse)
eine Layout-Mapping-Strategie mit benutzerdefinierten Strides
(Klasse)
spaltenorientierte Layout-Mapping-Strategie mit Padding-Stride, der größer oder gleich der linksten Dimension sein kann
(Klassentemplate)
zeilenorientierte Layout-Mapping-Strategie mit Padding-Stride, der größer oder gleich der rechtesten Dimension sein kann
(Klassentemplate)
Subview-Hilfsmittel
ein Slice-Spezifizierer-Tag, das den vollständigen Indexbereich in der angegebenen Dimension beschreibt.
(Tag)
ein Slice-Spezifizierer, der eine Menge regelmäßig beabstandeter Indizes repräsentiert, angegeben durch einen Offset, eine Dimension und einen Stride
(Klassentemplate)
ein Rückgabetyp der Überladungen von submdspan_mapping
(Klassentemplate)

Deduktionshilfen

Hinweise

Feature-Test Makro Wert Std Feature
__cpp_lib_mdspan 202207L (C++23) std::mdspan
__cpp_lib_submdspan 202306L (C++26) std::submdspan
202403L (C++26) std::mdspan gepolsterte Layouts
__cpp_lib_aligned_accessor 202411L (C++26) std::aligned_accessor

Beispiel

Kann auf Compiler Explorer vorgezeigt werden.

#include <cstddef>
#include <mdspan>
#include <print>
#include <vector>
int main()
{
    std::vector v{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
    // View data as contiguous memory representing 2 rows of 6 ints each
    auto ms2 = std::mdspan(v.data(), 2, 6);
    // View the same data as a 3D array 2 x 3 x 2
    auto ms3 = std::mdspan(v.data(), 2, 3, 2);
    // Write data using 2D view
    for (std::size_t i = 0; i != ms2.extent(0); i++)
        for (std::size_t j = 0; j != ms2.extent(1); j++)
            ms2[i, j] = i * 1000 + j;
    // Read back using 3D view
    for (std::size_t i = 0; i != ms3.extent(0); i++)
    {
        std::println("slice @ i = {}", i);
        for (std::size_t j = 0; j != ms3.extent(1); j++)
        {
            for (std::size_t k = 0; k != ms3.extent(2); k++)
                std::print("{} ", ms3[i, j, k]);
            std::println("");
        }
    }
}

Ausgabe:

slice @ i = 0
0 1
2 3
4 5
slice @ i = 1
1000 1001
1002 1003
1004 1005

Siehe auch

(C++20)
eine nicht-besitzende Ansicht über eine zusammenhängende Objektsequenz
(Klassentemplate)
numerische Arrays, Arraymasken und Arrayslices
(Klassentemplate)