読者です 読者をやめる 読者になる 読者になる

C++1z mapとunordered_mapに、挿入失敗時の動作を規定した新たなメンバ関数を追加

C++

一意なキーを持つstd::mapstd::unordered_mapに対して、2種類のメンバ関数が追加されます。対象には、std::multimapstd::unordered_multimapおよび集合コンテナは含みません。

  1. try_emplace()メンバ関数 : 挿入失敗時に、与えられたパラメータargs...を変更しないことが保証される
  2. insert_or_assign()メンバ関数 : 挿入に失敗したら上書きする (m[key] = value;と同じような動作)

元々はinsert()emplace()の仕様を修正することが考えられていましたが、議論の結果、別名の関数が定義されることになりました。

std::map<std::string, std::unique_ptr<Foo>> m;
m["foo"] = nullptr;

std::unique_ptr<Foo> p(new Foo);
auto res = m.try_emplace("foo", std::move(p));
assert(p); // pは有効

insert_or_assign()は、これまでと同様にpair<iterator, bool>を戻り値として返します。挿入に失敗して上書き操作をするときに、second == falseとなります。

宣言

// mapとunordered_mapのメンバ関数
template <class... Args>
pair<iterator, bool> try_emplace(const key_type& k, Args&&... args);
template <class... Args>
pair<iterator, bool> try_emplace(key_type&& k, Args&&... args);
template <class... Args>
iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args);
template <class... Args>
iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args);

template <class M>
pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj);
template <class M>
pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj);
template <class M>
iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj);
template <class M>
iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj);

参照

お断り

この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。