Namespaces
Variants

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

De fr.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)

Récupérer des éléments individuels ou des portions du tableau.

Les surcharges const qui renvoient des séquences d'éléments créent un nouvel objet std::valarray. Les surcharges non-const renvoient des classes contenant des références aux éléments du tableau.

1,2)

Si pos < size() vaut false, le comportement est indéfini.

(jusqu'à C++26)

Si pos < size() vaut false:

  • Si l'implémentation est durcie, une violation de contrat se produit.
  • Si l'implémentation n'est pas durcie, le comportement est indéfini.
(depuis C++26)
3-10) Si l'argument ne spécifie pas un sous-ensemble valide de *this, le comportement est indéfini.

Paramètres

pos - position de l'élément à retourner
slicearr - slice des éléments à retourner
gslicearr - gslice des éléments à retourner
boolarr - masque des éléments à retourner
indarr - indices des éléments à retourner

Valeur de retour

1,2) Une référence à l'élément correspondant.
3,5,7,9) Un std::valarray objet contenant des copies des éléments sélectionnés.
4,6,8,10) La structure de données correspondante contenant les références aux éléments sélectionnés.

Exceptions

Peut lever des exceptions définies par l'implémentation.

Notes

Pour des valeurs std::valarray appropriées a, b et des valeurs std::size_t appropriées i, j, toutes les expressions suivantes sont toujours évaluées à true:

1) (a[i] = q, a[i]) == q pour non-const a
2) &a[i + j] == &a[i] + j
  • Cela signifie que les éléments de std::valarray sont adjacents en mémoire.
3) &a[i] != &b[j] pour chaque objet a et b qui ne sont pas des alias l'un de l'autre
  • Cela signifie qu'il n'y a pas d'alias dans les éléments et cette propriété peut être utilisée pour effectuer certains types d'optimisation.

Les références deviennent invalides lors de resize() ou lorsque le tableau est détruit.

Pour les surcharges (3,5,7,9), la fonction peut être implémentée avec un type de retour différent de std::valarray. Dans ce cas, le type de remplacement a les propriétés suivantes :

  • Toutes les fonctions membres const de std::valarray sont fournies.
  • std::valarray, std::slice_array, std::gslice_array, std::mask_array et std::indirect_array peuvent être construits à partir du type de remplacement.
  • Pour chaque fonction prenant un const std::valarray<T>& sauf begin() et end()(depuis C++11), des fonctions identiques prenant les types de remplacement doivent être ajoutées ;
  • Pour chaque fonction prenant deux arguments const std::valarray<T>&, des fonctions identiques prenant toutes les combinaisons de const std::valarray<T>& et de types de remplacement doivent être ajoutées.
  • Le type de retour n'ajoute pas plus de deux niveaux d'imbrication de template par rapport au type d'argument le plus profondément imbriqué.

Les accès par tranche/masque/index indirect ne s'enchaînent pas : v[v == n][std::slice(0, 5, 2)] = x; est une erreur car std::mask_array (le type de v[v == n]) n'a pas operator[].

Exemple

#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';
}

Sortie :

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

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Applicable à Comportement publié Comportement corrigé
LWG 389 C++98 le type de retour de la surcharge (1) était T corrigé en const T &
LWG 430 C++98 le comportement était ambigu pour les surcharges
(3-10) si un sous-ensemble invalide était spécifié
le comportement est
indéfini dans ce cas