std::valarray<T>::operator=
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) from a scalar
print("assigned from scalar: ", v1);
v1 = {1, 2, 3, 4, 5, 6}; // (8): from initializer list of different size
print("assigned from initializer_list:", v1);
std::valarray<int> v2(3);
v2 = v1[std::slice(0, 3, 2)]; // (4): from slice array
print("every 2nd element starting at pos 0:", v2);
v2 = v1[v1 % 2 == 0]; // (6): from mask array
print("values that are even:", v2);
std::valarray<std::size_t> idx = {0, 1, 2, 4}; // index array
v2.resize(4); // sizes must match when assigning from gen subscript
v2 = v1[idx]; // (7): from indirect array
print("values at positions 0, 1, 2, 4:", v2);
}Вывод:
assigned from scalar: -1 -1 -1 assigned from initializer_list: 1 2 3 4 5 6 every 2nd element starting at pos 0: 1 3 5 values that are even: 2 4 6 values at positions 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() | не требуется изменение размера в этом случае |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/numeric/valarray/operator%3D