C++マップ内のキーを検索する方法

  1. マップ内のキーを見つけるには std::map::find メソッドを使う
  2. マップのキーを見つけるには std::map::count メソッドを使う
  3. マップからキーを探すには std::map::contains メソッドを用いる

この記事では、C++で指定された map に指定されたキーが存在するかどうかを調べる方法を説明します。ここで説明したメソッドはすべて対数的な時間的複雑さを持つことに注意してください。

マップ内のキーを見つけるには std::map::find メソッドを使う

特定のキーを調べるには、find メソッドを用いることができます。指定したキーを持つ要素が見つからない場合、戻り値は map.end() イテレータとなります。そこで、この機能を利用して、if 文の中で 2つのイテレータの値を比較し、出力を表示します。

#include <iostream>
#include <map>

using std::cout;
using std::cin;
using std::endl;
using std::map;
using std::string;

int main(){
    map<string, string> veggy_map = {{"a", "Asparagus",},
                                   {"b", "Beetroot",},
                                   {"g", "Ginger",},
                                   {"m", "Melon",},
                                   {"p", "Pumpkin",},
                                   {"s", "Spinach",}};
    string key_to_find = "m";

    if (veggy_map.find(key_to_find) != veggy_map.end()) {
        cout << "Key Exists!" << endl;
    }

    return EXIT_SUCCESS;
}

出力:

Key Exists!

マップのキーを見つけるには std::map::count メソッドを使う

特定のキーを検索するもう一つの方法は count である。この関数は指定されたキーに関連する要素の数をカウントする。コンテナ std::map はキーの重複を許さないので、このメソッドの戻り値がゼロにならなければ、問題の答えは肯定的なものとみなすことができます。

#include <iostream>
#include <map>

using std::cout;
using std::cin;
using std::endl;
using std::map;
using std::string;

int main(){
    map<string, string> veggy_map = {{"a", "Asparagus",},
                                   {"b", "Beetroot",},
                                   {"g", "Ginger",},
                                   {"m", "Melon",},
                                   {"p", "Pumpkin",},
                                   {"s", "Spinach",}};
    string key_to_find = "m";

    if (veggy_map.count(key_to_find)) {
        cout << "Key Exists!" << endl;
    }

    return EXIT_SUCCESS;
}

与えられたコンテナが multimap であれば、count メソッドの戻り値を再利用して、以下の例のようにループの繰り返しとして渡すことができる。

#include <iostream>
#include <map>

using std::cout;
using std::cin;
using std::endl;
using std::multimap;
using std::string;

int main(){
    multimap<string, string> veggy_map = {{"a", "Asparagus",},
                                   {"b", "Beetroot",},
                                   {"b", "Broccoli",},
                                   {"g", "Ginger",},
                                   {"m", "Melon",},
                                   {"p", "Pumpkin",},
                                   {"s", "Spinach",}};
    string key_to_find = "b";

    auto ret = veggy_map.count(key_to_find);
    while (ret) {
        cout << "Key Exists!" << endl;
        ret -= 1;
    }

    return EXIT_SUCCESS;
}

出力:

Key Exists!
Key Exists!

マップからキーを探すには std::map::contains メソッドを用いる

このバージョンでは、このタスクに最適な C++20 のメソッド contains を利用しています。このメソッドは、マップ内に指定されたキー要素が見つかった場合に true のブール値を返す。

#include <iostream>
#include <map>

using std::cout;
using std::cin;
using std::endl;
using std::map;
using std::string;

int main(){
    map<string, string> veggy_map = {{"a", "Asparagus",},
                                   {"b", "Beetroot",},
                                   {"g", "Ginger",},
                                   {"m", "Melon",},
                                   {"p", "Pumpkin",},
                                   {"s", "Spinach",}};
    string key_to_find = "m";

    if (veggy_map.contains(key_to_find)) {
        cout << "Key Exists!" << endl;
    }

    return EXIT_SUCCESS;
}
comments powered by Disqus