名前空間
変種
操作

std::unordered_map::try_emplace

提供: cppreference.com
 
 
 
 
template <class... Args>
pair<iterator, bool> try_emplace(const key_type& k, Args&&... args);
(1) (C++17以上)
template <class... Args>
pair<iterator, bool> try_emplace(key_type&& k, Args&&... args);
(2) (C++17以上)
template <class... Args>
iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args);
(3) (C++17以上)
template <class... Args>
iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args);
(4) (C++17以上)
1) k と等しいキーがコンテナ内にすでに存在する場合は何もしません。 そうでなければ、要素が value_type(std::piecewise_construct, std::forward_as_tuple(k), std::forward_as_tuple(std::forward<Args>(args)...)) として構築されることを除き、 emplace と同様に振舞います。
2) k と等しいキーがコンテナ内にすでに存在する場合は何もしません。 そうでなければ、要素が value_type(std::piecewise_construct, std::forward_as_tuple(std::move(k)), std::forward_as_tuple(std::forward<Args>(args)...)) として構築されることを除き、 emplace と同様に振舞います。
3) k と等しいキーがコンテナ内にすでに存在する場合は何もしません。 そうでなければ、要素が value_type(std::piecewise_construct, std::forward_as_tuple(k), std::forward_as_tuple(std::forward<Args>(args)...)) として構築されることを除き、 emplace_hint と同様に振舞います。
4) k と等しいキーがコンテナ内にすでに存在する場合は何もしません。 そうでなければ、要素が value_type(std::piecewise_construct, std::forward_as_tuple(std::move(k)), std::forward_as_tuple(std::forward<Args>(args)...)) として構築されることを除き、 emplace_hint と同様に振舞います。

挿入によって再ハッシュが発生した場合は、すべてのイテレータが無効化されます。 そうでなければ、イテレータは影響を受けません。 参照は無効化されません。 再ハッシュは新しい要素数が max_load_factor()*bucket_count() より大きい場合にのみ発生します。

目次

[編集] 引数

k - 検索するためと見つからない場合に挿入するための両方に使用されるキー
hint - 前に新しい要素が挿入される位置のイテレータ
args - 要素のコンストラクタに転送される引数

[編集] 戻り値

1,2) emplace と同じ。
3,4) emplace_hint と同じ。

[編集] 計算量

1,2) emplace と同じ。
3,4) emplace_hint と同じ。

[編集] ノート

insertemplace と異なり、これらの関数は挿入が起きなかった場合、右辺値引数からムーブしません。 これにより std::unordered_map<std::string, std::unique_ptr<foo>> のようなムーブオンリーな型の値を持つマップを操作しやすくなります。 さらに、 value_type (つまり std::pair) を構築するための引数が要求される emplace と異なり、 try_emplace はキーと mapped_type に渡す引数を別々に扱います。

[編集]

#include <iostream>
#include <utility>
#include <string>
 
#include <unordered_map>
int main()
{
    using namespace std::literals;
    std::unordered_map<std::string, std::string> m;
 
    m.try_emplace("a", "a"s);
    m.try_emplace("b", "abcd");
    m.try_emplace("c", 10, 'c');
    m.try_emplace("c", "Won't be inserted");
 
    for (const auto &p : m) {
        std::cout << p.first << " => " << p.second << '\n';
    }
}

出力例:

a => a
b => abcd
c => cccccccccc

[編集] 関連項目

要素をその場で構築します
(パブリックメンバ関数) [edit]
ヒントを使用して要素をその場で構築します
(パブリックメンバ関数) [edit]
要素またはノード (C++17以上)を挿入します
(パブリックメンバ関数) [edit]