std::valarray<T>:: operator=
From cppreference.net
|
valarray
<
T
>
&
operator
=
(
const
valarray
<
T
>
&
other
)
;
|
(1) | |
|
valarray
<
T
>
&
operator
=
(
valarray
<
T
>
&&
other
)
noexcept
;
|
(2) | (начиная с 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) | (начиная с C++11) |
Заменяет содержимое числового массива.
1)
Оператор копирующего присваивания. Если
size
(
)
!
=
other.
size
(
)
, сначала изменяет размер
*
this
как если бы вызовом
resize
(
other.
size
(
)
)
. Каждый элемент
*
this
получает значение соответствующего элемента из
other
.
2)
Оператор перемещающего присваивания. Заменяет содержимое
*
this
содержимым
other
. Значение
other
после этой операции не определено. Сложность операции может быть линейной, если T имеет нетривиальные деструкторы, но обычно является константной в противном случае.
3)
Заменяет каждое значение в
*
this
копией
val
.
4-7)
Заменяет содержимое
*
this
результатом операции обобщённого индексирования. Поведение не определено, если
size()
не равно длине
other
или если любое значение слева зависит от значения справа (например,
v
=
v
[
v
>
2
]
).
8)
Присваивает содержимое списка инициализации
il
. Эквивалентно
*
this
=
valarray
(
il
)
.
Содержание |
Параметры
| other | - | другой числовой массив (или маска) для присваивания |
| val | - | значение для инициализации каждого элемента |
| il | - | список инициализации для присваивания |
Возвращаемое значение
* this
Исключения
1,3-8)
Может выбрасывать исключения, определяемые реализацией.
Пример
Запустить этот код
#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) из скаляра print("присвоено из скаляра: ", v1); v1 = {1, 2, 3, 4, 5, 6}; // (8): из списка инициализации другого размера print("присвоено из initializer_list:", v1); std::valarray<int> v2(3); v2 = v1[std::slice(0, 3, 2)]; // (4): из срезового массива print("каждый 2-й элемент начиная с позиции 0:", v2); v2 = v1[v1 % 2 == 0]; // (6): из маскирующего массива print("значения, которые четные:", v2); std::valarray<std::size_t> idx = {0, 1, 2, 4}; // индексный массив v2.resize(4); // размеры должны совпадать при присвоении из генераторного индекса v2 = v1[idx]; // (7): из косвенного массива print("значения на позициях 0, 1, 2, 4:", v2); }
Вывод:
присвоено из скаляра: -1 -1 -1 присвоено из initializer_list: 1 2 3 4 5 6 каждый 2-й элемент начиная с позиции 0: 1 3 5 значения, которые четные: 2 4 6 значения на позициях 0, 1, 2, 4: 1 2 3 5
Отчёты о дефектах
Следующие отчеты об изменениях в поведении, содержащие описания дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение как опубликовано | Корректное поведение |
|---|---|---|---|
| LWG 624 | C++98 |
поведение перегрузок
(4-7)
было
неясным, если длина other не равна
size()
|
поведение является
неопределённым в этом случае |
| LWG 630 | C++98 |
поведение оператора присваивания копированием
было неопределённым, если size ( ) ! = other. size ( ) |
изменяет размер
*
this
сначала в этом случае |
| LWG 2071 | C++11 |
оператор присваивания перемещением изменял размер
* this если size ( ) ! = other. size ( ) |
не требуется
изменять размер в этом случае |