Namespaces
Variants

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

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

Recupera elementos individuales o porciones del arreglo.

Las const sobrecargas que devuelven secuencias de elementos crean un nuevo objeto std::valarray. Las sobrecargas no const devuelven clases que contienen referencias a los elementos del arreglo.

1,2)

Si pos < size() es false, el comportamiento no está definido.

(hasta C++26)

Si pos < size() es false:

(desde C++26)
3-10) Si el argumento no especifica un subconjunto válido de *this, el comportamiento no está definido.

Parámetros

pos - posición del elemento a devolver
slicearr - slice de los elementos a devolver
gslicearr - gslice de los elementos a devolver
boolarr - máscara de los elementos a devolver
indarr - índices de los elementos a devolver

Valor de retorno

1,2) Una referencia al elemento correspondiente.
3,5,7,9) Un objeto std::valarray que contiene copias de los elementos seleccionados.
4,6,8,10) La estructura de datos correspondiente que contiene referencias a los elementos seleccionados.

Excepciones

Puede lanzar excepciones definidas por la implementación.

Notas

Para valores apropiados std::valarray a, b y valores apropiados std::size_t i, j, todas las siguientes expresiones siempre se evalúan como true:

1) (a[i] = q, a[i]) == q para no-const a
2) &a[i + j] == &a[i] + j
  • Esto significa que los elementos de std::valarray son adyacentes en memoria.
3) &a[i] != &b[j] para cada objeto a y b que no son alias entre sí
  • Esto significa que no hay alias en los elementos y esta propiedad se puede usar para realizar algunos tipos de optimización.

Las referencias se invalidan al resize() o cuando se destruye el arreglo.

Para las sobrecargas (3,5,7,9), la función puede implementarse con un tipo de retorno diferente de std::valarray. En este caso, el tipo de reemplazo tiene las siguientes propiedades:

  • Todas las funciones miembro de conststd::valarray se proporcionan.std::valarray
  • , std::slice_array, std::gslice_array, std::mask_array y std::indirect_array pueden construirse a partir del tipo de reemplazo.Para cada función que toma un
  • excepto const std::valarray<T>& begin() y end()(desde C++11), se agregarán funciones idénticas que tomen los tipos de reemplazo;Para cada función que toma dos argumentos
  • , se agregarán funciones idénticas que tomen cada combinación de const std::valarray<T>& y tipos de reemplazo.const std::valarray<T>&
  • El tipo de retorno no agrega más de dos niveles de anidamiento de plantilla sobre el tipo de argumento más profundamente anidado.

Los accesos de índice por segmento/máscara/indirecto no se encadenan: v[v == n][std::slice(0, 5, 2)] = x; es un error porque std::mask_array (el tipo de v[v == n]) no tiene operator[].

Ejemplo

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

Salida:

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

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 389 C++98 el tipo de retorno de la sobrecarga (1) era T corregido a const T &
LWG 430 C++98 el comportamiento no estaba claro para las sobrecargas
(3-10) si se especifica un subconjunto inválido
el comportamiento es
indefinido en este caso