目次
はじめに
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 |
コンテナの特性に合った最適な検索方法を選択することが、効率的で読みやすいコードを書くための鍵となります。特に、連想コンテナでは、必ず高速なメンバ関数の方を使うようにしましょう。