Namensräume
Varianten
Aktionen

std::gslice

Von cppreference.com
< cpp‎ | numeric‎ | valarray
 
 
 
 
Definiert in der Header-Datei <valarray>
class gslice;

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

Gegeben den Startwert s, eine Liste von Schrittweiten ij und eine Liste von Größen dj, wählt ein std::gslice, das aus diesen Werten konstruiert wird, die Menge der Indizes kj=s+Σj(ijdj) aus.

Zum Beispiel erzeugt ein gslice mit Startindex 3, Schrittweiten {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 Schrittweiten {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 konstante Version von std::valarray::operator[] verwendet werden, andernfalls ist das Verhalten undefiniert.

Inhalt

[edit] Member functions

(Konstruktor)
konstruiert einen generischen Slice
(öffentliche Memberfunktion)
startsizestride
gibt die Parameter des Slices zurück
(öffentliche Memberfunktion)

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) Default-Konstruktor. Äquivalent zu gslice(0, std::valarray<std::size_t(), std::valarray<std::size_t()). Dieser Konstruktor existiert nur, um die Konstruktion von Arrays von Slices zu ermöglichen.
2) Konstruiert einen neuen Slice mit den Parametern start, sizes, strides.
3) Konstruiert eine Kopie von other.

Parameter

start - die Position des ersten Elements
Größen - ein Array, das die Anzahl der Elemente in jeder Dimension definiert
Schrittweiten - ein Array, das die Anzahl der Positionen zwischen aufeinanderfolgenden Elementen in jeder Dimension definiert
Sonstiges - ein anderer Slice zum Kopieren


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 beim Konstruieren übergebenen Parameter des Slices zurück - start, sizes und strides.

Parameter

(keine)

Rückgabewert

Die Parameter des Slices - start, sizes und strides.

Komplexität

Konstant.

[edit] Example

Demonstriert die Verwendung von gslices zum Adressieren 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

[edit] Defect reports

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

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

[edit] See also

liest/schreibt Array-Element, Slice oder Maske
(public member function) [edit]
BLAS-ähnlicher Slice eines Valarrays: Startindex, Länge, Schrittweite
(class) [edit]
Proxy für eine Teilmenge eines Valarrays nach Anwendung eines gslice
(class template) [edit]