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)) { // キーが存在する } }
簡単ですが以上です。