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
Ejecutar este código
#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 |