template <class M>
pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj); // (1)
template <class M>
pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj); // (2)
template <class M>
iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj); // (3)
template <class M>
iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj); // (4)
概要
引数 k
で指定されたキーが存在しなければ対応する値を引数 obj
のキーとして要素を挿入し(insert
)、さもなければ(or
)、そのキーに対応する値に引数 obj
を代入する(assign
)。
引数 hint
は、k
を検索する際のヒントに使用される。(が、実際に使用されることはないものと思われる。emplace_hint
の備考を参照)
テンプレートパラメータ制約
- (1)、(3) :
is_assignable_v<mapped_type&, M&&>
がtrue
であること。value_type
は、k
,forward<M>(obj)
からmap
に直接構築可能であること - (2)、(4) :
is_assignable_v<mapped_type&, M&&>
がtrue
であること。value_type
は、move(k)
,forward<M>(obj)
からmap
に直接構築可能であること
効果
- (1)、(3) :
unordered_map
がk
と同値のキーを持つ要素e
を持っている場合、e.second
にforward<M>(obj)
を代入する。そうでなければ、k
,forward<M>(obj)
から構築したvalue_type
型のオブジェクトを挿入する。 - (2)、(4) :
unordered_map
がk
と同値のキーを持つ要素e
を持っている場合、e.second
にforward<M>(obj)
を代入する。そうでなければ、move(k)
,forward<M>(obj)
から構築したvalue_type
型のオブジェクトを挿入する。
戻り値
- (1)、(2) : イテレータと
bool
値のpair
を返す。- 挿入された場合には、
first
に挿入された要素へのイテレータ、second
にtrue
が設定される。 - 代入された場合には、
first
に代入された要素へのイテレータ、second
にfalse
が設定される。
- 挿入された場合には、
- (3)、(4) :
- 挿入された場合には、挿入された要素へのイテレータを返す。
- 代入された場合には、代入された要素へのイテレータを返す。
計算量
- (1)、(2) :
emplace
と同じ。 - (3)、(4) :
emplace_hint
と同じ。
備考
-
規格にはこの関数の例外安全性についての記載が無いが、
emplace
やemplace_hint
と等価と考えて問題ないと思われる。 -
規格にはこの関数が呼ばれた後のイテレータや要素へのポインタ・参照の有効性についての記載が無いが、
emplace
やemplace_hint
と等価と考えて問題ないと思われる。 -
このメンバ関数の
機能テストマクロ
は以下の通り。マクロ名 値 __cpp_lib_unordered_map_try_emplace
201411
例
#include <iostream>
#include <unordered_map>
#include <string>
#include <utility>
#include <memory>
template <typename T>
void print(const T& t, bool u)
{
std::cout << "key = " << t.first->first << ", value = " << *t.first->second
<< ", is inserted = " << t.second << ", is empty = " << u << '\n';
}
int main()
{
std::unordered_map<std::string, std::unique_ptr<int>> um;
std::cout << std::boolalpha;
auto u1 = std::make_unique<int>(1);
auto p1 = um.insert_or_assign("one", std::move(u1));
print(p1, !u1);
auto u2 = std::make_unique<int>(2);
auto p2 = um.insert_or_assign("two", std::move(u2));
print(p2, !u2);
auto u3 = std::make_unique<int>(42);
auto p3 = um.insert_or_assign("two", std::move(u3));
print(p3, !u3);
}
出力
key = one, value = 1, is inserted = true, is empty = true
key = two, value = 2, is inserted = true, is empty = true
key = two, value = 42, is inserted = false, is empty = true
バージョン
言語
- C++17
処理系
- Clang: 3.7.0 ✅
- GCC: 6.1.0 ✅
- ICC: ??
- Visual C++: ??
関連項目
名前 | 説明 |
---|---|
emplace |
コンテナ内への要素の直接構築 |
emplace_hint |
挿入位置のヒントを使用したコンテナ内への要素の直接構築 |
insert |
要素の追加 |
erase |
要素の削除 |
clear |
全要素の削除 |
swap |
内容の交換 |
bucket_count |
バケット数の取得 |
load_factor |
現在の負荷率(バケットあたりの要素数の平均)を取得 |
max_load_factor |
負荷率の最大値を取得、設定 |
rehash |
最小バケット数指定によるバケット数の調整 |
reserve |
最小要素数指定によるバケット数の調整 |