一意なキーを持つ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の以下の階層の下に解説ページを用意する予定です。