Namespaces
Variants

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

Von de.cppreference.net
 
 
 
 
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.

1,2)

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

(bis C++26)

Falls pos < size() false ist:

  • Falls die Implementierung gehärtet ist, tritt eine Vertragsverletzung auf.
  • Falls die Implementierung nicht gehärtet ist, ist das Verhalten undefiniert.
(seit C++26)
3-10) Falls das Argument keine gültige Teilmenge von *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

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.

Anmerkungen

Für geeignete std::valarray-Werte a, b und geeignete std::size_t-Werte i, j ergeben alle folgenden Ausdrücke stets true:

1) (a[i] = q, a[i]) == q für nicht-konstante a
2) &a[i + j] == &a[i] + j
  • Dies bedeutet, dass std::valarray-Elemente im Speicher benachbart sind.
3) &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 const Elementfunktionen 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 aus const 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