Namespaces
Variants

std::valarray<T>:: operator=

From cppreference.net
valarray < T > & operator = ( const valarray < T > & other ) ;
(1)
valarray < T > & operator = ( valarray < T > && other ) noexcept ;
(2) (desde C++11)
valarray < T > & operator = ( const T & val ) ;
(3)
valarray < T > & operator = ( const std:: slice_array < T > & other ) ;
(4)
valarray < T > & operator = ( const std:: gslice_array < T > & other ) ;
(5)
valarray < T > & operator = ( const std:: mask_array < T > & other ) ;
(6)
valarray < T > & operator = ( const std:: indirect_array < T > & other ) ;
(7)
valarray < T > & operator = ( std:: initializer_list < T > il ) ;
(8) (desde C++11)

Reemplaza el contenido del arreglo numérico.

1) Operador de asignación de copia. Si size ( ) ! = other. size ( ) , primero redimensiona * this como si fuera mediante resize ( other. size ( ) ) . Cada elemento de * this es asignado con el valor del elemento correspondiente de other .
2) Operador de asignación de movimiento. Reemplaza los contenidos de * this con los de other . El valor de other queda no especificado después de esta operación. La complejidad de esta operación puede ser lineal si T tiene destructores no triviales, pero normalmente es constante en caso contrario.
3) Reemplaza cada valor en * this con una copia de val .
4-7) Reemplaza el contenido de * this con el resultado de una operación de indexación generalizada. El comportamiento es indefinido si size() no es igual a la longitud de other o si algún valor a la izquierda depende del valor a la derecha (por ejemplo, v = v [ v > 2 ] ).
8) Asigna el contenido de la lista de inicialización il . Equivalente a * this = valarray ( il ) .

Contenidos

Parámetros

other - otro array numérico (o una máscara) para asignar
val - el valor para inicializar cada elemento
il - lista de inicializadores para asignar

Valor de retorno

* this

Excepciones

1,3-8) Puede lanzar excepciones definidas por la implementación.

Ejemplo

#include <iomanip>
#include <iostream>
#include <valarray>
void print(const char* rem, const std::valarray<int>& v)
{
    std::cout << std::left << std::setw(36) << rem << std::right;
    for (int n : v)
        std::cout << std::setw(3) << n;
    std::cout << '\n';
}
int main()
{
    std::valarray<int> v1(3);
    v1 = -1; // (3) desde un escalar
    print("asignado desde escalar: ", v1);
    v1 = {1, 2, 3, 4, 5, 6}; // (8): desde lista de inicialización de tamaño diferente
    print("asignado desde initializer_list:", v1);
    std::valarray<int> v2(3);
    v2 = v1[std::slice(0, 3, 2)]; // (4): desde array de slice
    print("cada 2do elemento comenzando en pos 0:", v2);
    v2 = v1[v1 % 2 == 0]; // (6): desde array de máscara
    print("valores que son pares:", v2);
    std::valarray<std::size_t> idx = {0, 1, 2, 4}; // array de índices
    v2.resize(4); // los tamaños deben coincidir al asignar desde subíndice genérico
    v2 = v1[idx]; // (7): desde array indirecto
    print("valores en posiciones 0, 1, 2, 4:", v2);
}

Salida:

asignado desde escalar:                -1 -1 -1
asignado desde initializer_list:       1  2  3  4  5  6
cada 2do elemento comenzando en pos 0:  1  3  5
valores que son pares:                 2  4  6
valores en posiciones 0, 1, 2, 4:       1  2  3  5

Informes de defectos

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

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 624 C++98 los comportamientos de las sobrecargas (4-7) eran
poco claros si la longitud de other no es size()
los comportamientos son
indefinidos en este caso
LWG 630 C++98 el comportamiento del operador de asignación de copia
era indefinido si size ( ) ! = other. size ( )
redimensiona * this
primero en este caso
LWG 2071 C++11 el operador de asignación de movimiento redimensionaba
* this si size ( ) ! = other. size ( )
no se requiere
redimensionar en este caso