std::valarray<T>::operator[]
const T& operator[]( std::size_t pos ) const;
|
(1) | |
T& operator[]( std::size_t pos );
|
(2) | |
std::valarray<T> operator[]( std::slice slicearr ) const;
|
(3) | |
std::slice_array<T> operator[]( std::slice slicearr );
|
(4) | |
std::valarray<T> operator[]( const std::gslice& gslicearr ) const;
|
(5) | |
std::gslice_array<T> operator[]( const std::gslice& gslicearr );
|
(6) | |
std::valarray<T> operator[]( const std::valarray<bool>& boolarr ) const;
|
(7) | |
std::mask_array<T> operator[]( const std::valarray<bool>& boolarr );
|
(8) | |
std::valarray<T> operator[]( const std::valarray<std::size_t>& indarr ) const;
|
(9) | |
std::indirect_array<T> operator[]( const std::valarray<std::size_t>& indarr );
|
(10) | |
Einzelne Elemente oder Teile des Arrays abrufen.
Die const-Überladungen, die Elementsequenzen zurückgeben, erstellen ein neues std::valarray-Objekt.
Die nicht-const-Überladungen geben Klassen zurück, die Referenzen auf die Array-Elemente enthalten.
|
Falls |
(bis C++26) |
|
Falls
|
(seit C++26) |
*this angibt, ist das Verhalten undefiniert.Parameter
| pos | - | Position des zurückzugebenden Elements |
| slicearr | - | slice der zurückzugebenden Elemente |
| gslicearr | - | gslice der zurückzugebenden Elemente |
| boolarr | - | Maske der zurückzugebenden Elemente |
| indarr | - | Indizes der zurückzugebenden Elemente |
Rückgabewert
Exceptions
Kann implementierungsdefinierte Ausnahmen auslösen.
Anmerkungen
Für geeignete std::valarray-Werte a, b und geeignete std::size_t-Werte i, j ergeben alle folgenden Ausdrücke stets true:
(a[i] = q, a[i]) == q für nicht-konstante a&a[i + j] == &a[i] + j
- Dies bedeutet, dass std::valarray-Elemente im Speicher benachbart sind.
&a[i] != &b[j] für jedes Objekt a und b, die keine Aliase voneinander sind
- Dies bedeutet, dass es keine Aliase in den Elementen gibt und diese Eigenschaft zur Durchführung bestimmter Optimierungen genutzt werden kann.
Referenzen werden ungültig bei resize() oder wenn das Array zerstört wird.
Für Überladungen (3,5,7,9) kann die Funktion mit einem Rückgabetyp implementiert werden, der sich von std::valarray unterscheidet. In diesem Fall hat der Ersatztyp die folgenden Eigenschaften:
- Alle
constElementfunktionen von std::valarray werden bereitgestellt. - std::valarray, std::slice_array, std::gslice_array, std::mask_array und std::indirect_array können aus dem Ersatztyp konstruiert werden.
- Für jede Funktion, die ein
const std::valarray<T>&akzeptiert, außer begin() und end()(seit C++11), müssen identische Funktionen hinzugefügt werden, die die Ersatztypen akzeptieren; - Für jede Funktion, die zwei
const std::valarray<T>&Argumente akzeptiert, müssen identische Funktionen hinzugefügt werden, die jede Kombination ausconst std::valarray<T>&und Ersatztypen akzeptieren. - Der Rückgabetyp fügt nicht mehr als zwei Ebenen der Templateschachtelung über dem am tiefsten geschachtelten Argumenttyp hinzu.
Slice-/Mask-/Indirekte-Index-Zugriffe verketten nicht: v[v == n][std::slice(0, 5, 2)] = x; ist ein Fehler, da std::mask_array (der Typ von v[v == n]) kein operator[] besitzt.
Beispiel
#include <cstddef> #include <iomanip> #include <iostream> #include <valarray> int main() { std::valarray<int> data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; std::cout << "Initial valarray: "; for (int n : data) std::cout << std::setw(3) << n; std::cout << '\n'; data[data > 5] = -1; // valarray<bool> overload of operator[] // the type of data > 5 is std::valarray<bool> // the type of data[data > 5] is std::mask_array<int> std::cout << "After v[v > 5] = -1:"; for (std::size_t n = 0; n < data.size(); ++n) std::cout << std::setw(3) << data[n]; // regular operator[] std::cout << '\n'; }
Ausgabe:
Initial valarray: 0 1 2 3 4 5 6 7 8 9 After v[v > 5] = -1: 0 1 2 3 4 5 -1 -1 -1 -1
Fehlerberichte
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 389 | C++98 |
der Rückgabetyp von Überladung
(1)
war
T
|
korrigiert zu const T & |
| LWG 430 | C++98 |
das Verhalten war unklar für Überladungen
(3-10) wenn eine ungültige Teilmenge angegeben wird |
das Verhalten ist
in diesem Fall undefiniert |