Namespaces
Variants

std::valarray<T>:: operator[]

From cppreference.net
(Anmerkung: Der bereitgestellte HTML-Code enthält keinen übersetzbaren Text, da alle Tags leer sind. Die Struktur wurde gemäß den Anforderungen unverändert beibehalten.)
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 halten.

1,2)

Wenn pos < size ( ) false ist, ist das Verhalten undefiniert.

(bis C++26)

Wenn pos < size ( ) false ist:

  • Wenn die Implementierung gehärtet ist, tritt eine Vertragsverletzung auf. Wenn der Vertragsverletzungs-Handler unter "observe"-Auswertungssemantik zurückkehrt, ist das Verhalten undefiniert.
  • Wenn die Implementierung nicht gehärtet ist, ist das Verhalten undefiniert.
(seit C++26)
3-10) Wenn das Argument keine gültige Teilmenge von * this spezifiziert, ist das Verhalten undefiniert.

Inhaltsverzeichnis

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

1,2) Ein Verweis auf das entsprechende Element.
3,5,7,9) Ein std::valarray -Objekt, das Kopien der ausgewählten Elemente enthält.
4,6,8,10) Die entsprechende Datenstruktur, die Verweise auf die ausgewählten Elemente enthält.

Exceptions

Kann implementierungsdefinierte Ausnahmen auslösen.

Hinweise

Für korrekte std::valarray Werte a , b und korrekte std::size_t Werte i , j , evaluieren alle der folgenden Ausdrücke immer zu true :

1) ( a [ i ] = q, a [ i ] ) == q für nicht-konstantes a
2) & a [ i + j ] == & a [ i ] + j
  • Dies bedeutet, dass std::valarray Elemente im Speicher aufeinanderfolgend angeordnet sind.
3) & a [ i ] ! = & b [ j ] für alle Objekte a und b , die keine Aliase voneinander sind
  • Dies bedeutet, dass es keine Aliase in den Elementen gibt und diese Eigenschaft genutzt werden kann, um bestimmte Arten von Optimierungen durchzuführen.

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 besitzt der Ersatztyp folgende Eigenschaften:

Slice/Mask/Indirekte Indexzugriffe lassen sich nicht verketten: v [ v == n ] [ std:: slice ( 0 , 5 , 2 ) ] = x ; ist ein Fehler, weil std::mask_array (der Typ von v [ v == n ] ) keinen 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