unordered_map& operator=(const unordered_map& v); // (1)
unordered_map& operator=(unordered_map&& rv); // (2)
unordered_map& operator=(unordered_map&& x)
noexcept(allocator_traits<Allocator>::is_always_equal::value
&& is_nothrow_move_assignable<Hash>::value
&& is_nothrow_move_assignable<Pred>::value); // (2) C++17
unordered_map& operator=(initializer_list<value_type> il); // (3)
概要
unordered_map
オブジェクトを代入する
要件
-
(1)、および、(3) の形式の場合、以下の条件を満たすこと。
value_type
はこのコンテナに対してコピー挿入可能(CopyInsertable)であること。key_type
、および、mapped_type
はコピー代入可能(CopyAssignable)であること。(value_type
はstd::pair<const key_type, mapped_type>
であるため、コピー代入可能ではない)
-
(2) の形式の場合、
std::allocator_traits<allocator_type>::propagate_on_container_move_assignment::value
がfalse
であれば、以下の条件を満たすこと。value_type
はこのコンテナに対してムーブ挿入可能(MoveInsertable)であること。(但し、備考参照)key_type
、および、mapped_type
はムーブ代入可能(MoveAssignable)であること。(value_type
はstd::pair<const key_type, mapped_type>
であるため、ムーブ代入可能ではない)
効果
-
(1) :
v
の全ての要素がコピー代入される。ハッシュ関数オブジェクト、キー比較用関数オブジェクト、max_load_factor()
の値もコピーされる。 アロケータオブジェクトは、std::allocator_traits<allocator_type>::propagate_on_container_copy_assignment::value
がtrue
の場合に限りコピーされる。 -
(2) : ハッシュ関数オブジェクト、キー比較用関数オブジェクトの値はムーブされる。
max_load_factor()
の値はコピーされる。 アロケータオブジェクトは、std::allocator_traits<allocator_type>::propagate_on_container_move_assignment::value
がtrue
の場合に限りムーブされる。コンテナ内に元々存在していた要素は、代入されるか、破棄される(デストラクタが呼び出される)。 -
(3) : イテレータ範囲
[il.begin(), il.end())
がコピー代入される。 コンテナ内に元々存在していた要素は、代入されるか、破棄される(デストラクタが呼び出される)。
事後条件
以下では構築されたオブジェクトを u
とする。
- (1)
u == v
。 - (2)
u == 代入前の rv
。 - (3) -
戻り値
*this
計算量
- (1) : 平均的には O(n)、ここで、
n = v.size()
。最悪のケースでは O(n2) - (2) : 線形時間。
- (3) : 代入対象を
a
、a
の型をX
とすると、a = X(il)
と同様。(備考参照)
備考
-
(3) の形式の場合、計算量は
a = X(il)
と同様となっているが、効果がa = X(il)
と同様なわけではない。(ハッシュ関数オブジェクト、キー比較用関数オブジェクト、アロケータオブジェクト、max_load_factor()
等が異なる) -
(2) の形式の要件に、「
value_type
はこのコンテナに対してムーブ挿入可能であること」というものがあるが、value_type
はstd::pair<const key_type, mapped_type>
であるため、通常のムーブ挿入可能の条件に合わせるとkey_type
にコピーコンストラクタが必要となってしまう。 従って、規格書に明確な記載はないものの、この場合のムーブ挿入可能とは、m
をアロケータ型allocator_type
の左辺値、p
を要素型value_type
へのポインタ、krv
をキーの型key_type
の右辺値、mrv
を値の型mapped_type
の右辺値とすると、以下の式が適格(well-formed)であるということであるものと思われる。std::allocator_traits<allocator_type>::construct(m, p, krv, mrv)
バージョン
言語
- C++11
処理系
- Clang: 3.0 ✅, 3.1 ✅
- GCC: 4.4.7 ✅, 4.5.3 ✅, 4.6.3 ✅, 4.7.0 ✅
- ICC: ?
- Visual C++: ?
関連項目
名前 | 説明 |
---|---|
(constructor) |
コンストラクタ |
(destructor) |
デストラクタ |
参照
- N2679 Initializer Lists for Standard Containers(Revision 1)
- (3)の経緯となる提案文書
- N4258 Cleaning-up noexcept in the Library, Rev 3
noexcept
追加の経緯となる提案文書