【C++】コンテナの要素を検索する方法 (find, find_if, map::find)

目次

はじめに

C++でvectormapなどのコンテナを扱う際、「特定の条件に合う要素を探し出す」という操作は、最も基本的な処理の一つです。C++の標準ライブラリは、この検索処理のために、効率的で汎用的なツールを提供しています。

この記事では、コンテナの種類に応じた、2つの主要な検索アプローチを解説します。

  1. 逐次コンテナ (vectorなど): <algorithm>ライブラリのstd::find / std::find_if を使う。
  2. 連想コンテナ (mapなど): コンテナ自身が持つ、より高速な.findメンバ関数や.containsメンバ関数を使う。

1. vector等の逐次コンテナの要素を検索する

std::vectorstd::listのように、要素が順番に並んでいるコンテナでは、<algorithm>ヘッダーの汎用的な検索アルゴリズムを使います。

std::findstd::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;
}

解説:

  • 戻り値は「イテレータ」: findfind_ifは、見つかった要素を指すイテレータを返します。
  • 見つからなかった場合: もし要素が見つからなければ、コンテナの終端イテレータ (.end()) を返します。そのため、戻り値が .end() と等しいかどうかをチェックすることで、検索が成功したかを判定できます。
  • find: 特定のに完全に一致する最初の要素を探します。
  • find_if: ラムダ式などで定義された条件に最初に一致する要素を探します。

2. map等の連想コンテナの要素を検索する

std::mapstd::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

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

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次