std::find_if アルゴリズム C++
-
std::find_if
関数を使用して、指定された基準を満たす要素を検索する -
2つの範囲で
std::find_first_of
関数を使用して一致する要素を検索する -
区切り文字で
find_end
関数を使用して文字列を分割する
この記事では、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