template<class M>
pair<iterator, bool>
insert_or_assign(const key_type& k,
M&& obj); // (1) C++23
template<class M>
pair<iterator, bool>
insert_or_assign(key_type&& k,
M&& obj); // (2) C++23
template<class K, class M>
pair<iterator, bool>
insert_or_assign(K&& k,
M&& obj); // (3) C++23
template<class M>
iterator
insert_or_assign(const_iterator hint,
const key_type& k,
M&& obj); // (4) C++23
template<class M>
iterator
insert_or_assign(const_iterator hint,
key_type&& k,
M&& obj); // (5) C++23
template<class K, class M>
iterator
insert_or_assign(const_iterator hint,
K&& k,
M&& obj); // (6) C++23
概要
引数 k
で指定されたキーが存在しなければ対応する値を引数 obj
の値として要素を挿入し(insert
)、さもなければ(or
)、そのキーに対応する値に引数 obj
を代入する(assign
)。
引数 hint
は、k
を検索する際のヒントに使用される。
- (1) :
key_type
型のキーをとって挿入もしくは代入する - (2) :
key_type
型の一時オブジェクトのキーをとって挿入もしくは代入する - (3) :
key_type
に変換可能な型のキーをとって挿入もしくは代入する - (4) : 挿入位置のヒントをともない、
key_type
型のキーをとって挿入もしくは代入する - (5) : 挿入位置のヒントをともない、
key_type
型の一時オブジェクトのキーをとって挿入もしくは代入する - (6) : 挿入位置のヒントをともない、
key_type
に変換可能な型のキーをとって挿入もしくは代入する
テンプレートパラメータ制約
- (1), (2), (4), (5) :
is_assignable_v<mapped_type&, M>
がtrue
であることis_constructible_v<mapped_type, M>
がtrue
であること
- (3), (6) :
key_compare::is_transparent
が妥当な修飾IDであり、型を示すことis_constructible_v<key_type, K>
がtrue
であることis_assignable_v<mapped_type&, M>
がtrue
であることis_constructible_v<mapped_type, M>
がtrue
であること
なお、規格に記載はないが、hint
は emplace_hint
と同様、コンテナの有効な読み取り専用イテレータである必要があるものと思われる。
事前条件
効果
-
(1), (2), (3) :
k
と等価なキーをもつ要素e
が存在している場合、std::forward<M>(obj)
をe.second
に代入する- そうでなければ、以下と等価:
try_emplace(std::forward<decltype(k)>(k), std::forward<M>(obj));
-
(4), (5), (6) :
k
と等価なキーをもつ要素e
が存在している場合、std::forward<M>(obj)
をe.second
に代入する- そうでなければ、以下と等価:
try_emplace_hint(hint, std::forward<decltype(k)>(k), std::forward<M>(obj));
戻り値
- (1)、(2)、(3) : イテレータと
bool
値のpair
を返す。- 挿入された場合には、
first
に挿入された要素へのイテレータ、second
にtrue
が設定される。 - 代入された場合には、
first
に代入された要素へのイテレータ、second
にfalse
が設定される。
- 挿入された場合には、
- (4)、(5)、(6) :
- 挿入された場合には、挿入された要素へのイテレータを返す。
- 代入された場合には、代入された要素へのイテレータを返す。
計算量
- (1)、(2)、(3) :
emplace
と同じ - (4)、(5)、(6) :
emplace_hint
と同じ
例
#include <iostream>
#include <flat_map>
#include <string>
int main()
{
std::flat_map<std::string, int> fm;
auto [it1, b1] = fm.insert_or_assign("foo", 42);
std::cout << '(' << it1->first << ", " << it1->second << "), " << std::boolalpha << b1 << '\n';
auto [it2, b2] = fm.insert_or_assign("foo", 0);
std::cout << '(' << it2->first << ", " << it2->second << "), " << std::boolalpha << b2 << '\n';
}
出力
(foo, 42), true
(foo, 0), false
バージョン
言語
- C++23
処理系
- Clang: ??
- GCC: ??
- Visual C++: ??
関連項目
名前 | 説明 |
---|---|
flat_map::insert |
要素を挿入する |
flat_map::insert_range |
Rangeを挿入する |
flat_map::emplace |
要素を直接構築する |
flat_map::emplace_hint |
ヒントを使って要素を直接構築する |
flat_map::try_emplace |
キーが存在しない場合のみ要素を直接構築する |