C++ で std::map::find 関数を使用する
 
この記事では、C++ で std::map::find 関数とその代替機能を利用する方法について説明します。
C++ で std::map::find 関数を使用して指定されたキー値を持つ要素を検索する
    
std::map オブジェクトは、C++ 標準テンプレートライブラリの連想コンテナの 1つであり、キー値を格納するソートされたデータ構造を実装します。キーは std::map コンテナ内で一意であることに注意してください。したがって、既存のキーを使用して新しい要素を挿入した場合、操作は効果がありません。それでも、std::map クラスの一部の特別なメンバー関数は、キーが一致する場合、既存のペアに新しい値を割り当てることができます(例:insert_or_assign 関数)。
std::map コンテナの利点には、対数時間で実行できる高速な検索、挿入、および削除操作が含まれます。検索操作は、キーへの参照を受け入れる find メンバーによって提供されます。指定されたキーが std::map オブジェクトで見つかった場合、対応する要素へのイテレータが返されます。一方、指定されたキーがコンテナ内に見つからないとすると、過去のイテレータ(map::end())が返されます。
次のコードスニペットは、string ペアの map コンテナが任意の値で初期化され、次に"h"値を持つキーが検索される単純な使用シナリオを示しています。したがって、返されたイテレータを if-else ステートメントで処理して、要素ペアを出力するか、指定されたキーが見つからなかったというメッセージを出力します。
#include <iostream>
#include <map>
using std::cin;
using std::cout;
using std::endl;
using std::map;
using std::string;
int main() {
  std::map<string, string> m1 = {
      {"h", "htop"}, {"k", "ktop"}, {"t", "ttop"},
      {"r", "rtop"}, {"w", "wtop"}, {"p", "ptop"},
  };
  string key = "h";
  auto item = m1.find(key);
  if (item != m1.end()) {
    cout << "Key exists!  -  {" << item->first << ";" << item->second << "}\n";
  } else {
    cout << "Key does not exist!" << endl;
  }
  return EXIT_SUCCESS;
}
出力:
Key exists!  -  {h;htop}
contains メンバー関数を使用して、指定された要素が C++ のマップに存在するかどうかを確認する
指定された値のペアが map オブジェクトに存在するかどうかをユーザーが確認する必要がある場合は、メンバー関数 contains を利用できます。この関数は、C++ 20 バージョンから std::map コンテナの一部であるため、次のコードスニペットを実行するにはコンパイラのバージョンを知っている必要があります。contains 関数はキーへの参照を取得し、見つかった場合は bool 値 true を返します。このメンバー関数の時間計算量も対数です。
#include <iostream>
#include <map>
using std::cin;
using std::cout;
using std::endl;
using std::map;
using std::string;
int main() {
  std::map<string, string> m1 = {
      {"h", "htop"}, {"k", "ktop"}, {"t", "ttop"},
      {"r", "rtop"}, {"w", "wtop"}, {"p", "ptop"},
  };
  string key = "h";
  if (m1.contains(key)) {
    cout << "Key Exists!" << endl;
  } else {
    cout << "Key does not exist!" << endl;
  }
  return EXIT_SUCCESS;
}
出力:
Key Exists!
または、cout メンバー関数を使用して、指定されたキーを持つ要素ペアが map に存在するかどうかを確認することもできます。通常、cout 関数は、指定されたキーを持つ要素の数を取得するために使用されますが、std::map は一意のキー値のみを格納するため、要素が見つかった場合、プロセスは 1 を返します。それ以外の場合は、要素が見つからなかったことを示すゼロ値が返されます。
#include <iostream>
#include <map>
using std::cin;
using std::cout;
using std::endl;
using std::map;
using std::string;
int main() {
  std::map<string, string> m1 = {
      {"h", "htop"}, {"k", "ktop"}, {"t", "ttop"},
      {"r", "rtop"}, {"w", "wtop"}, {"p", "ptop"},
  };
  string key = "h";
  if (m1.count(key)) {
    cout << "Key Exists!" << endl;
  } else {
    cout << "Key does not exist!" << endl;
  }
  return EXIT_SUCCESS;
}
出力:
Key Exists!
