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) | |
Ruft einzelne Elemente oder Teile des Arrays ab.
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.
Die ausgewählten Elemente müssen existieren.
- für Überladungen (1,2), wenn pos kleiner als
size()ist, ist das Verhalten undefiniert; und - für Überladungen (3-10), wenn das Argument keine gültige Teilmenge von *this angibt, ist das Verhalten undefiniert.
Inhalt |
[edit] 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 |
[edit] Rückgabewert
[edit] Exceptions
Kann implementierungsdefinierte Ausnahmen auslösen.
[edit] Hinweise
Für korrekte std::valarray-Werte a, b und korrekte std::size_t-Werte i, j, sind alle folgenden Ausdrücke immer true
- Dies bedeutet, dass die Elemente von std::valarray im Speicher nebeneinander liegen.
- Dies bedeutet, dass es keine Aliase in den Elementen gibt und diese Eigenschaft zur Durchführung einiger 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 anderen Rückgabetyp als std::valarray implementiert werden. In diesem Fall hat der Ersatztyp folgende Eigenschaften:
- Alle const-Mitgliedsfunktionen von std::valarray sind vorhanden.
- 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>& als Argument nimmt (außer begin() und end())(seit C++11), werden identische Funktionen hinzugefügt, die die Ersatztypen nehmen;
- Für jede Funktion, die zwei Argumente vom Typ const std::valarray<T>& annimmt, werden identische Funktionen hinzugefügt, die jede Kombination aus const std::valarray<T>& und Ersatztypen annehmen.
- Der Rückgabetyp fügt nicht mehr als zwei Ebenen von Template-Verschachtelung über den am tiefsten verschachtelten Argumenttyp hinaus hinzu.
Slice-/Masken-/Indirekte Indexzugriffe sind nicht verkettet: v[v == n][std::slice(0, 5, 2)] = x; ist ein Fehler, da std::mask_array (der Typ von v[v == n]) keine operator[] hat.
[edit] 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
[edit] 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 nicht definiert. |