std::valarray<T>::operator=
From cppreference.com
| 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) と同等です。
目次 |
[編集] パラメータ
| その他 | - | 代入する別の数値配列(またはマスク)。 |
| 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 をリサイズしていました。 |
この場合、 リサイズすることは要求されていませんでした。 |