一意なキーを持つstd::mapとstd::unordered_mapに対して、2種類のメンバ関数が追加されます。対象には、std::multimapやstd::unordered_multimapおよび集合コンテナは含みません。
try_emplace()メンバ関数 : 挿入失敗時に、与えられたパラメータargs...を変更しないことが保証される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);
参照
- N3873 Improved insertion interface for unique-key maps
- N4006 An improved
emplace()for unique-key maps - N4279 Improved insertion interface for unique-key maps (Revision 2.3)
お断り
この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。