名前空間
変種
操作

std::valarray<T>::operator=

From cppreference.com
< cpp‎ | numeric‎ | valarray
 
 
 
 
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() の場合、まず *thisresize(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) と同等です。

目次

[編集] パラメータ

その他 - 代入する別の数値配列(またはマスク)。
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 ムーブ代入演算子は、 size() != other.size() の場合、
*this をリサイズしていました。
この場合、
リサイズすることは要求されていませんでした。
English 日本語 中文(简体) 中文(繁體)