1. ホーム
  2. c++

[解決済み] unordered_map の unordered_map がキーを含むかどうかを確認する最も簡単な方法

2022-02-15 10:52:11

質問

unordered_mapのunordered_mapを使用していて、"multi key"構文を使用して要素を参照できるようにしているのですが、unordered_mapのunordered_mapを使用することはできますか?

my_map[k1][k2] .

同じ "multi-key" 構文を使用して、アクセスしようとする前に要素が存在するかどうかをチェックする便利な方法はありますか?そうでない場合、最も簡単な方法は何でしょうか?

どのように解決するのですか?

キーが存在するかどうかをテストすることが目的であれば、私なら

my_map[k1][k2]

なぜなら operator[] は、そのキーがまだ存在しない場合、デフォルトで新しい値を作成します。

むしろ、私は std::unordered_map::find . つまり、最初のキーは存在するが、2番目のキーは存在しないことが確実な場合、次のようにします。

if (my_map[k1].find(k2) != my_map[k1].end())
{
    // k2 exists in unordered_map for key k1
}

が存在するかどうかをチェックする関数を作りたい場合は、以下のようにします。 両方とも のようなキーは、次のように書くことができます。

//------------------------------------------------------------------------------
/// \brief Determines a nested map contains two keys (the outer containing the inner)
/// \param[in] data Outer-most map
/// \param[in] a    Key used to find the inner map
/// \param[in] b    Key used to find the value within the inner map
/// \return True if both keys exist, false otherwise
//------------------------------------------------------------------------------
template <class key_t, class value_t>
bool nested_key_exists(std::unordered_map<key_t, std::unordered_map<key_t, value_t>> const& data, key_t const a, key_t const b)
{
    auto itInner = data.find(a);
    if (itInner != data.end())
    {
        return itInner->second.find(b) != itInner->second.end();
    }
    return false;
}