Namespaces
Variants

std::gslice

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

std::gsliceist die Selektor-Klasse, die eine Teilmenge von std::valarray-Indizes identifiziert, die durch eine mehrstufige Menge von Schritten und Größen definiert ist. Objekte vom Typ std::gslicekönnen als Indizes mit dem operator[]operator[] von valarray verwendet werden, um beispielsweise Spalten eines mehrdimensionalen Arrays auszuwählen, das als valarraydargestellt wird.

Bei gegebenem Startwert s, einer Liste von Schritten ij und einer Liste von Größen dj, wählt ein aus diesen Werten konstruiertes std::gslicedie Menge der Indizes kj=s+Σj(ijdj) aus.

Zum Beispiel 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

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 gslices dürfen nur als Argumente für die const-Version von std::valarray::operator[] verwendet werden, andernfalls ist das Verhalten undefiniert.

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)