C++ 中的 std::find_if 算法
Jinku Hu
2023年10月12日
本文将演示如何使用 C++ 标准模板库中的 std::find_if
算法。
使用 std::find_if
函数搜索满足给定条件的元素
std::find_if
函数是 STL 算法的一部分,它提供了一种在满足给定条件的范围内搜索元素的方法。也就是说,条件被指定为一个可调用的对象,它返回一个 bool
值。
std::find_if
函数的基本重载接受两个迭代器,表示需要搜索的范围。第三个参数表示用于评估范围内元素的可调用对象。请注意,范围迭代器至少应满足 LegacyInputIterator
要求。
std::find_if
返回满足给定条件的第一个元素的迭代器,如果没有找到这样的元素,则返回第二个参数迭代器。
在下面的代码片段中,我们在 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
使用 std::find_first_of
函数在两个范围内搜索元素匹配
std::find_first_of
是 STL 的另一个强大算法,可用于在两个给定范围内搜索相同的元素。这些函数接受四个迭代器作为参数,其中前两个表示需要搜索作为最后两个迭代器参数传递的元素的范围。
后两个迭代器必须满足 LegacyForwardIterator
的要求。在这种情况下,我们使用 std::find_first_of
算法来检查两个字符串中的字符是否匹配。该函数的返回值是搜索范围中与第二个范围中的元素匹配的第一个元素的迭代器。如果没有找到这样的元素,则返回搜索范围的第二个迭代器。
#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
一样,该算法接受表示两个范围的四个迭代器,但它试图在第一个范围内找到精确的序列匹配。
#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
作者: Jinku Hu