目次
はじめに
C++でvectorやmapなどのコンテナを扱う際、「特定の条件に合う要素を探し出す」という操作は、最も基本的な処理の一つです。C++の標準ライブラリは、この検索処理のために、効率的で汎用的なツールを提供しています。
この記事では、コンテナの種類に応じた、2つの主要な検索アプローチを解説します。
- 逐次コンテナ (
vectorなど):<algorithm>ライブラリのstd::find/std::find_ifを使う。 - 連想コンテナ (
mapなど): コンテナ自身が持つ、より高速な.findメンバ関数や.containsメンバ関数を使う。
1. vector等の逐次コンテナの要素を検索する
std::vectorやstd::listのように、要素が順番に並んでいるコンテナでは、<algorithm>ヘッダーの汎用的な検索アルゴリズムを使います。
std::find と std::find_if のサンプルコード
#include <iostream>
#include <vector>
#include <algorithm> // find, find_if
using namespace std;
int main() {
vector<int> numbers = {10, 25, 30, 45, 50};
// --- 1. find: 特定の値に一致する要素を検索 ---
int value_to_find = 30;
auto it_found = find(numbers.begin(), numbers.end(), value_to_find);
if (it_found != numbers.end()) {
cout << "値 " << *it_found << " が見つかりました。" << endl;
} else {
cout << "値 " << value_to_find << " は見つかりませんでした。" << endl;
}
// --- 2. find_if: 条件に一致する最初の要素を検索 ---
// 条件: 40より大きい最初の要素
auto it_conditional = find_if(numbers.begin(), numbers.end(), [](int n){ return n > 40; });
if (it_conditional != numbers.end()) {
cout << "40より大きい最初の要素: " << *it_conditional << " が見つかりました。" << endl;
} else {
cout << "40より大きい要素は見つかりませんでした。" << endl;
}
return 0;
}
解説:
- 戻り値は「イテレータ」:
findとfind_ifは、見つかった要素を指すイテレータを返します。 - 見つからなかった場合: もし要素が見つからなければ、コンテナの終端イテレータ (
.end()) を返します。そのため、戻り値が.end()と等しいかどうかをチェックすることで、検索が成功したかを判定できます。 find: 特定の値に完全に一致する最初の要素を探します。find_if: ラムダ式などで定義された条件に最初に一致する要素を探します。
2. map等の連想コンテナの要素を検索する
std::mapやstd::setのような、キーに基づいて内部がソートされている連想コンテナは、std::findよりもはるかに高速な、専用の検索メンバ関数を持っています。
.find と .contains (C++20) のサンプルコード
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
map<string, int> stock = {
{"apple", 10},
{"banana", 25},
{"orange", 18}
};
// --- 1. .find()メンバ関数で検索 ---
string key_to_find = "banana";
auto it = stock.find(key_to_find);
if (it != stock.end()) {
// it->first はキー("banana"), it->second は値(25)
cout << ".find(): " << it->first << " の在庫は " << it->second << "個です。" << endl;
}
// --- 2. .contains()メンバ関数で存在確認 (C++20) ---
if (stock.contains("grape")) {
cout << ".contains(): grape はリストに存在します。" << endl;
} else {
cout << ".contains(): grape はリストに存在しません。" << endl;
}
return 0;
}
解説:
.find(キー): 指定したキーを持つ要素を検索し、その要素を指すイテレータを返します。見つからなければ.end()を返します。std::findよりも大幅に高速です(mapは内部的に二分探索木を使っているため)。.contains(キー)(C++20): 指定したキーが存在するかどうかを、直接bool値 (true/false) で返します。単純に存在確認だけをしたい場合は、.find()よりもコードが簡潔になります。
まとめ
今回は、C++のコンテナで要素を検索するための基本的な方法を解説しました。
| コンテナの種類 | 主な検索方法 | 戻り値 |
vectorなど逐次コンテナ | std::find, std::find_if | イテレータ |
map, setなど連想コンテナ | .find() (メンバ関数) | イテレータ |
(C++20以降) map, setなど | .contains() (メンバ関数) | bool |
コンテナの特性に合った最適な検索方法を選択することが、効率的で読みやすいコードを書くための鍵となります。特に、連想コンテナでは、必ず高速なメンバ関数の方を使うようにしましょう。
