📜  C++ STL-algorithm.find_if()函数(1)

📅  最后修改于: 2023-12-03 15:13:55.169000             🧑  作者: Mango

C++ STL-algorithm.find_if()函数

简介

std::find_if() 函数是 C++ STL 的算法库中的一个函数,用于在指定范围内按照指定条件查找元素。

函数原型如下:

template <class InputIterator, class UnaryPredicate>
InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred);

其中,firstlast 分别表示所要查找的元素的起始位置和终止位置(不包括终止位置)。pred 是一个一元谓词,用于指定查找条件。

函数返回的是 InputIterator 类型的迭代器,指向第一个符合查找条件的元素。

例子

下面是一个简单的示例,展示了如何使用 std::find_if() 函数查找一个字符串数组中对应某个前缀的第一个字符串。

#include <iostream>
#include <string>
#include <algorithm>

bool starts_with(const std::string& str, const std::string& prefix) {
    return str.size() >= prefix.size() && str.compare(0, prefix.size(), prefix) == 0;
}

int main() {
    std::string arr[] = {"apple", "banana", "cat", "dog", "elephant"};
    std::string prefix = "b";
    auto it = std::find_if(arr, arr + 5, [&](const std::string& str) {
        return starts_with(str, prefix);
    });
    if (it != arr + 5) {
        std::cout << "Found: " << *it << std::endl;
    } else {
        std::cout << "Not found" << std::endl;
    }
    return 0;
}

上面的程序中,我们使用了一个名为 starts_with() 的函数作为查找条件,它判断给定的字符串是否以指定的前缀开头。具体来说,它首先判断字符串长度是否不小于前缀长度,并且使用 std::string::compare() 方法比较前缀和字符串中相应位置的字符是否相同。如果相同,就继续比较下一个字符,如果最终都相同,则说明字符串以该前缀开头。

在主函数中,我们定义了一个字符串数组 arr,表示我们所要查找的范围。同时,我们定义了一个前缀字符串 prefix,表示我们要查找的条件。

我们调用 std::find_if() 函数,将数组 arr 和前缀字符串 prefix 作为参数传入,并使用一个 lambda 表达式作为谓词,该 lambda 表达式调用 starts_with() 函数来判断字符串是否符合查找条件。

std::find_if() 函数返回第一个符合条件的元素的迭代器,我们将其存入变量 it。最后,我们判断 it 是否等于数组末尾的迭代器,如果不是,就说明找到了符合条件的元素,并输出它的值;否则,就说明没有找到符合条件的元素。

总结

std::find_if() 函数是 C++ STL 中非常实用的一种算法,可以用于在指定范围内按照指定条件查找元素。使用时需要注意指定查找范围和指定查找条件,特别是对于谓词的定义需要非常清晰明确。