Spec-Zone.ru › C++

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API