C++のmap・unordered_mapでキーが存在するか確認する方法
C++のstd::mapやstd::unordered_mapは、キーとそれに対応する値をペアで管理する連想コンテナです。本記事では、指定したキーがマップ内に存在するかどうかを判定する方法を解説します。
find()を使ったキーの存在チェック
最も一般的な方法は、find()メンバ関数を使うことです。find()は指定したキーを検索し、見つかった場合はその要素へのイテレータを返します。キーが存在しない場合は、終端イテレータend()が返されるため、これを利用して存在判定を行えます。
サンプルコード
#include<iostream>
#include<map>
using namespace std;
string isPresent(map<string, int> m, string key) {
if (m.find(key) == m.end())
return "Not Present";
return "Present";
}
int main() {
map<string, int> my_map;
my_map["first"] = 4;
my_map["second"] = 6;
my_map["third"] = 6;
string check1 = "fifth", check2 = "third";
cout << check1 << ": " << isPresent(my_map, check1) << endl;
cout << check2 << ": " << isPresent(my_map, check2);
}実行結果
fifth: Not Present third: Present
この例では、「fifth」というキーはマップに登録されていないため「Not Present」が、「third」は登録済みのため「Present」が出力されます。
count()を使う代替手段
count()メンバ関数を使っても同様の判定が可能です。マップでは各キーは最大1つしか存在しないため、戻り値が1ならキーが存在し、0なら存在しないことを意味します。
if (my_map.count("third") > 0) {
// キーが存在する場合の処理
}C++20以降ならcontains()が便利
C++20からは、より直感的なcontains()メンバ関数が追加されました。キーが存在すればtrue、しなければfalseを返すため、コードの意図が明確になります。
if (my_map.contains("third")) {
// キーが存在する場合の処理
}mapとunordered_mapの違い
std::mapは内部に赤黒木(平衡二分探索木)を使用しており、キーが自動的にソートされた状態で保持されます。一方、std::unordered_mapはハッシュテーブルをベースとしており、平均的に高速な検索が可能です。どちらのコンテナでも、上記のfind()・count()・contains()によるキー存在チェックは同じように動作します。
-
C++で配列内に存在するキーKの出現確率を求める方法
問題概要サイズ「n」の配列が与えられ、その配列内に指定された要素 k が存在する場合に、その出現確率を求めることが課題です。配列の要素数と等しい「n」まで配列全体を走査し、指定された要素(キー)「k」を検索します。要素が配列内に存在する場合はその確率を計算して返し、存在しない場合は 0 を出力します。入力arr[] = { 1, 2, 3, 4, 5, 6} K = 5出力配列におけるキー 5 の確率 : 0.166入力arr[] = { 1,2,3,4,5,6,7 } K = 8出力配列におけるキー 8 の確率 : 0考え方上記はサイズ 7 の配列とキー 2 を例とした説明です。この場合、配
-
Pythonで文字列に部分文字列が含まれているか確認する3つの方法
Pythonでデータ分析を行っていると、ある部分文字列が別の大きな文字列の中に含まれているかどうかを確認したい場面によく出会います。本記事では、代表的な3つの方法(find()、in演算子、count())を使って部分文字列の存在をチェックする方法を、具体的なコード例とともに解説します。 方法1:find() メソッドを使う find() メソッドは、指定した値が文字列内で最初に出現する位置(インデックス)を返します。値が見つからなかった場合は -1 を返します。この性質を利用して、if文と組み合わせることで部分文字列が含まれているかを判定できます。 コード例 Astring = &quo