std::gslice
| 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.
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) |