mapでキーの有無を調べるには、find()よりcount()が便利


このエントリーをはてなブックマークに追加

mapコンテナ(mとする)でキーの有無を調べる場合、今まではメンバ関数のm.find()を呼ぶ方法を使っていた。m.find()を使う方法では、「m.find()の戻り値がm.end()に等しければキーが存在しない、そうでなければキーが存在する」としてキーの有無を判別していた。

しかし、m.count()を使った方がより直感的である。m.count()を使う方法では、「m.count()の戻り値が0に等しければキーが存在しない、1に等しければキーが存在する」という簡単仕様なので分かりやすい。

以下のコードでは、find()を使う場合とcount()を使う場合とを比較した。どちらも結果は同じである。

#include <iostream>
#include <map>

using namespace std;

bool has_key_using_find(map<int, string> &m, int n){
    if (m.find(n) == m.end()){
        cout << "m doesn't have " << n << "." << endl;
        return false;
    }
    else{
        cout << "m has " << n << "." << endl;
        return true;
    }
}

bool has_key_using_count(map<int, string> &m, int n){
    if (m.count(n) == 0){
        cout << "m doesn't have " << n << "." << endl;
        return false;
    }
    else{
        cout << "m has " << n << "." << endl;
        return true;
    }
}

int main(void){
    map<int, string> m;
    m[1] = "a";
    m[3] = "bb";
    m[5] = "ccc";

    has_key_using_find(m, 3); // true
    has_key_using_find(m, 4); // false

    has_key_using_count(m, 3); // true
    has_key_using_count(m, 4); // false
    
    return 0;
}

出力はこんな感じ。

m has 3.
m doesn't have 4.
m has 3.
m doesn't have 4.

参考:c++ - How to check if std::map contains a key without doing insert? - Stack Overflow