C++ 中的 std::find_if 算法

Jinku Hu 2023年1月30日 2021年10月2日
  1. 使用 std::find_if 函数搜索满足给定条件的元素
  2. 使用 std::find_first_of 函数在两个范围内搜索元素匹配
  3. 使用 find_end 函数用分隔符分割字符串
C++ 中的 std::find_if 算法

本文将演示如何使用 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::cout; using std::cin;
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::cout; using std::cin;
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::cout; using std::cin;
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
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相关文章 - C++ Algorithm