Namespaces
Variants

std:: gslice

From cppreference.net
Definiert im Header <valarray>
class gslice ;

std::gslice ist die Selektor-Klasse, die eine Teilmenge von std::valarray -Indizes identifiziert, die durch einen mehrstufigen Satz von Schritten und Größen definiert wird. Objekte vom Typ std::gslice können als Indizes mit valarrays operator [ ] verwendet werden, um beispielsweise Spalten eines mehrdimensionalen Arrays auszuwählen, das als valarray dargestellt wird.

Gegeben den Startwert s , eine Liste von Schrittwerten i j und eine Liste von Größen d j , wählt ein std::gslice , das aus diesen Werten konstruiert wurde, die Menge der Indizes k j =s+Σ j (i j d j ) aus.

Beispielsweise erzeugt ein gslice mit Startindex 3 , Schritten {19,4,1 } und Längen {2,4,3 } die folgende Menge von 24=2*4*3 Indizes:

3 + 0 * 19 + 0 * 4 + 0 * 1 = 3 ,
3 + 0 * 19 + 0 * 4 + 1 * 1 = 4 ,
3 + 0 * 19 + 0 * 4 + 2 * 1 = 5 ,
3 + 0 * 19 + 1 * 4 + 0 * 1 = 7 ,
3 + 0 * 19 + 1 * 4 + 1 * 1 = 8 ,
3 + 0 * 19 + 1 * 4 + 2 * 1 = 9 ,
3 + 0 * 19 + 2 * 4 + 0 * 1 = 11 ,
...
3 + 1 * 19 + 3 * 4 + 1 * 1 = 35 ,
3 + 1 * 19 + 3 * 4 + 2 * 1 = 36

**Anmerkung:** Da der Text innerhalb der ` ` Tags als Code behandelt wird und mathematische Ausdrücke enthält, wurde er gemäß den Anweisungen nicht übersetzt. Die numerischen Werte und Operatoren bleiben unverändert, da es sich um universelle mathematische Notation handelt.

Es ist möglich, std::gslice -Objekte zu konstruieren, die einige Indizes mehrfach auswählen: Wenn das obige Beispiel die Schritte {1,1,1} verwendet hätte, wären die Indizes {3, 4, 5, 4, 5, 6, ...} gewesen. Solche gslice-Objekte dürfen nur als Argumente für die konstante Version von std::valarray::operator[] verwendet werden, andernfalls ist das Verhalten undefiniert.

Inhaltsverzeichnis

Memberfunktionen

(constructor)
konstruiert einen generischen Slice
(public member function)
start size stride
gibt die Parameter des Slices zurück
(public member function)

std::gslice:: gslice

gslice ( )
(1)
gslice ( std:: size_t start, const std:: valarray < std:: size_t > & sizes,
const std:: valarray < std:: size_t > & strides ) ;
(2)
gslice ( const gslice & other ) ;
(3)

Konstruiert einen neuen generischen Slice.

1) Standardkonstruktor. Entspricht gslice ( 0 , std:: valarray < std:: size_t > ( ) , std:: valarray < std:: size_t > ( ) ) . Dieser Konstruktor existiert nur, um die Konstruktion von Slice-Arrays zu ermöglichen.
2) Konstruiert einen neuen Slice mit den Parametern start , sizes , strides .
3) Erstellt eine Kopie von other .

Parameter

start - die Position des ersten Elements
sizes - ein Array, das die Anzahl der Elemente in jeder Dimension definiert
strides - ein Array, das die Anzahl der Positionen zwischen aufeinanderfolgenden Elementen in jeder Dimension definiert
other - ein anderer zu kopierender Slice


std::slice:: start, size, stride

std:: size_t start ( ) const ;
(1)
std:: valarray < std:: size_t > size ( ) const ;
(2)
std:: valarray < std:: size_t > stride ( ) const ;
(3)

Gibt die Parameter zurück, die beim Konstruieren des Slice übergeben wurden - Start, Größe und Schrittweite.

Parameter

(keine)

Rückgabewert

Die Parameter des Slice - Start, Größe und Schrittweite.

Komplexität

Konstant.

Beispiel

Demonstriert die Verwendung von gslices zur Adressierung von Spalten eines 3D-Arrays:

#include <iostream>
#include <valarray>
void test_print(std::valarray<int>& v, int planes, int rows, int cols)
{
    for (int r = 0; r < rows; ++r)
    {
        for (int z = 0; z < planes; ++z)
        {
            for (int c = 0; c < cols; ++c)
                std::cout << v[z * rows * cols + r * cols + c] << ' ';
            std::cout << "  ";
        }
        std::cout << '\n';
    }
}
int main()
{
    std::valarray<int> v = // 3d array: 2 x 4 x 3 elements
        {111,112,113 , 121,122,123 , 131,132,133 , 141,142,143,
         211,212,213 , 221,222,223 , 231,232,233 , 241,242,243};
    // int ar3d[2][4][3]
    std::cout << "Initial 2x4x3 array:\n";
    test_print(v, 2, 4, 3);
    // update every value in the first columns of both planes
    v[std::gslice(0, {2, 4}, {4 * 3, 3})] = 1; // two level one strides of 12 elements
                                               // then four level two strides of 3 elements
    // subtract the third column from the second column in the 1st plane
    v[std::gslice(1, {1, 4}, {4 * 3, 3})] -= v[std::gslice(2, {1, 4}, {4 * 3, 3})];
    std::cout << "\n" "After column operations:\n";
    test_print(v, 2, 4, 3);
}

Ausgabe:

Initial 2x4x3 array:
111 112 113   211 212 213
121 122 123   221 222 223
131 132 133   231 232 233
141 142 143   241 242 243
After column operations:
1 -1 113   1 212 213
1 -1 123   1 222 223
1 -1 133   1 232 233
1 -1 143   1 242 243

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 543 C++98 es war unklar, ob ein standardkonstruierter generischer Slice verwendbar ist er ist verwendbar (als leere Teilmenge)

Siehe auch

Valarray-Element, -Slice oder -Maske abrufen/festlegen
(öffentliche Elementfunktion)
BLAS-ähnlicher Slice eines Valarrays: Startindex, Länge, Schrittweite
(Klasse)
Proxy für eine Teilmenge eines Valarrays nach Anwendung eines Gslice
(Klassentemplate)