std::find_if アルゴリズム C++

胡金庫 2023年10月12日
  1. std::find_if 関数を使用して、指定された基準を満たす要素を検索する
  2. 2つの範囲で std::find_first_of 関数を使用して一致する要素を検索する
  3. 区切り文字で find_end 関数を使用して文字列を分割する
std::find_if アルゴリズム C++

この記事では、C++ 標準テンプレートライブラリの std::find_if アルゴリズムを利用する方法を説明します。

std::find_if 関数を使用して、指定された基準を満たす要素を検索する

std::find_if 関数は STL アルゴリズムの一部であり、指定された条件を満たす範囲内の要素を検索する方法を提供します。つまり、条件は、bool 値を返す呼び出し可能なオブジェクトとして指定されます。

std::find_if 関数の基本的なオーバーロードは、検索する必要のある範囲を示す 2つのイテレータを受け入れます。3 番目のパラメーターは、範囲内の要素を評価するために使用される呼び出し可能オブジェクトを表します。範囲イテレータは、少なくとも LegacyInputIterator 要件を満たす必要があることに注意してください。

std::find_if は、指定された条件を満たす最初の要素にイテレータを返します。そのような要素が見つからない場合は、2 番目の引数イテレータを返します。

次のコードスニペットでは、std::string オブジェクトに std::find_if アルゴリズムを採用し、呼び出し可能なオブジェクトとして isupper 関数を使用しています。したがって、この関数は、文字列に小文字のみが含まれているかどうかを判断するのに役立ちます。

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

int main() {
  string str1 = "this is random String";
  string str2 = "this is";
  string str3 = "wqz";

  std::find_if(begin(str1), end(str1), isupper) != end(str1)
      ? cout << "str1 contains uppercase letters" << endl
      : cout << "str1 contains only lowercase letters" << endl;

  std::find_if(begin(str2), end(str2), isupper) != end(str2)
      ? cout << "str2 contains uppercase letters" << endl
      : cout << "str2 contains only lowercase letters" << endl;

  return EXIT_SUCCESS;
}

出力:

str1 contains uppercase letters
str2 contains only lowercase letters

2つの範囲で std::find_first_of 関数を使用して一致する要素を検索する

std::find_first_of は、STL のもう 1つの強力なアルゴリズムであり、2つの指定された範囲で同じ要素を検索するために利用できます。関数はパラメーターとして 4つのイテレーターを受け入れ、最初の 2つは、最後の 2つのイテレーター引数として渡された要素を検索する必要がある範囲を示します。

後者の 2つのイテレータは、LegacyForwardIterator の要件を満たしている必要があります。この場合、std::find_first_of アルゴリズムを使用して、文字が 2つの文字列で一致するかどうかを確認します。関数の戻り値は、2 番目の範囲の要素と一致する検索範囲の最初の要素へのイテレーターです。そのような要素が見つからない場合は、検索された範囲の 2 番目のイテレータが返されます。

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

int main() {
  string str1 = "this is random String";
  string str2 = "this is";
  string str3 = "wqz";

  std::find_first_of(str1.begin(), str1.end(), str2.begin(), str2.end()) ==
          str1.end()
      ? cout << "no letters match in str1 and str2" << endl
      : cout << "some letters match in str1 and str2" << endl;

  std::find_first_of(str2.begin(), str2.end(), str3.begin(), str3.end()) ==
          str2.end()
      ? cout << "no letters match in str2 and str3" << endl
      : cout << "some letters match in str2 and str3" << endl;

  return EXIT_SUCCESS;
}

出力:

some letters match in str1 and str2
no letters match in str2 and str3

区切り文字で find_end 関数を使用して文字列を分割する

一方、別の範囲で指定された範囲シーケンスの最後の出現を検索するための find_end アルゴリズムがあります。std::find_first_of と同様に、このアルゴリズムは両方の範囲を示す 4つのイテレータを受け入れますが、最初の範囲で完全に一致するシーケンスを見つけようとします。

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

int main() {
  string str1 = "this is random String";
  string str2 = "this is";
  string str3 = "wqz";

  auto ret = std::find_end(str1.begin(), str1.end(), str2.begin(), str2.end());
  ret == str1.end() ? cout << "no such sequence found" << endl
                    : cout << "last occurrence found at "
                           << std::distance(str1.begin(), ret) << endl;

  ret = std::find_end(str2.begin(), str2.end(), str3.begin(), str3.end());
  ret == str2.end() ? cout << "no such sequence found" << endl
                    : cout << "last occurrence found at "
                           << std::distance(str2.begin(), ret) << endl;

  return EXIT_SUCCESS;
}

出力:

last occurrence found at 0
no such sequence found
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Algorithm