PG日誌

各記事はブラウザの横幅を1410px以上にすると2カラムの見出しが表示されます。なるべく横に広げてみてください。

C++でstd::mapにキーが存在するか調べる(C++20含む

C++の連想配列クラスのstd::mapの、テーブル内にキーが存在するかどうか確認するための方法の紹介です。

ものすごーく古くからあるクラスなので若干クセがあります。

C++20ならcontainsメソッドを使う

C++20であればmapにcontainsというメソッドが追加されているので(ほかの近代的なライブラリ同様に)以下の操作で簡単にキーの存在を確認することができます。

#include <map>

using namespace std;

void foo()
{
    map<int, int> map { { 1, 1 }, { 2, 2 }, { 3, 3 } };

    if (map.contains(3))
    {
        // キーが存在する
    }
}

C++20以下ならfind(もしくはcount)で探す

C++11以降からキーがソートされないパフォーマンスが良いとされるunordered_mapと、従来からあるmapの2種類が存在します。

といっても両方は操作が同じなのでfindをテンプレート化して同じ操作が適用できるようにしたいと思います。

#include <map>
#include <unordered_map>

using namespace std;

// mapとunordered_mapでキーを探すテンプレート
template<class MAP, class VALUE>
static bool contains_key(MAP m, VALUE v)
{
    return m.find(v) != m.end(); // findを使ったいつものやつ
}

void foo()
{
    // いつものmap
    map<int, int> map { { 1, 1 }, { 2, 2 }, { 3, 3 } };
    
    // キーがソートされないmap
    unordered_map<int, int> umap { { 1, 1 }, { 2, 2 }, { 3, 3 } };

    // mapのキーを検索する
    if (contains_key(map, 2))
    {
        // キーが存在する
    }

    // unordered_mapのキーを検索する
    if (contains_key(umap, 1))
    {
        // キーが存在する
    }
}

簡単ですが以上です。