最終更新日時(UTC):
が更新

履歴 編集

function template
<map>

std::map::insert_or_assign(C++17)

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 を検索する際のヒントに使用される。

  • (1) : key_type型のキーをとって挿入もしくは代入する
  • (2) : key_type型の一時オブジェクトのキーをとって挿入もしくは代入する
  • (3) : 挿入位置のヒントをともない、key_type型のキーをとって挿入もしくは代入する
  • (4) : 挿入位置のヒントをともない、key_type型の一時オブジェクトのキーをとって挿入もしくは代入する

テンプレートパラメータ制約

  • (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 に直接構築可能であること

なお、規格に記載はないが、hintemplace_hint と同様、コンテナの有効な読み取り専用イテレータである必要があるものと思われる。

効果

  • (1)、(3) : mapk と同値のキーを持つ要素 e を持っている場合、e.secondforward<M>(obj) を代入する。そうでなければ、k, forward<M>(obj) から構築した value_type 型のオブジェクトを挿入する。
  • (2)、(4) : mapk と同値のキーを持つ要素 e を持っている場合、e.secondforward<M>(obj) を代入する。そうでなければ、move(k), forward<M>(obj) から構築した value_type 型のオブジェクトを挿入する。

戻り値

  • (1)、(2) : イテレータと bool 値の pair を返す。
    • 挿入された場合には、first に挿入された要素へのイテレータ、secondtrue が設定される。
    • 代入された場合には、first に代入された要素へのイテレータ、secondfalse が設定される。
  • (3)、(4) :
    • 挿入された場合には、挿入された要素へのイテレータを返す。
    • 代入された場合には、代入された要素へのイテレータを返す。

計算量

備考

このメンバ関数の機能テストマクロは以下の通り。

マクロ名
__cpp_lib_map_try_emplace 201411

#include <iostream>
#include <map>
#include <string>

int main()
{
  std::map<std::string, int> m;

  auto [it1, b1] = m.insert_or_assign("foo", 42);
  std::cout << '(' << it1->first << ", " << it1->second << "), " << std::boolalpha << b1 << '\n';

  auto [it2, b2] = m.insert_or_assign("foo", 0);
  std::cout << '(' << it2->first << ", " << it2->second << "), " << std::boolalpha << b2 << '\n';
}

出力

(foo, 42), true
(foo, 0), false

バージョン

言語

  • C++17

処理系

関連項目

名前 説明
map::insert 要素を挿入する
map::emplace 要素を直接構築する
map::emplace_hint ヒントを使って要素を直接構築する
map::try_emplace キーが存在しない場合のみ要素を直接構築する

参照