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) (начиная с 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 ( )
не требуется
изменять размер в этом случае