Namespaces
Variants

std::valarray<T>::operator=

来自 zh.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("从位置0开始的每第2个元素:", 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
从位置0开始的每第2个元素:  1  3  5
偶数值:                 2  4  6
位置0、1、2、4处的值:       1  2  3  5

缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的C++标准。

缺陷报告 应用于 发布时行为 正确行为
LWG 624 C++98 当 other 的长度不等于 size() 时
重载 (4-7) 的行为不明确
此情况下行为
未定义
LWG 630 C++98 当 size ( ) ! = other. size ( ) 时
拷贝赋值运算符行为未定义
此情况下先调整
* this 的大小
LWG 2071 C++11 当 size ( ) ! = other. size ( ) 时
移动赋值运算符会调整 * this 大小
此情况下不要求
调整大小