您的位置:

std::find函数详解

一、std::findif

在讨论std::find之前,我们必须了解std::findif。std::findif函数是一个可以应用于任何容器的顺序查找算法,可以自定义找寻的谓词以实现查找目标的灵活调整,例如其他同样重要的查找算法std::search和std::findend。

template < class InputIt, class UnaryPredicate >
InputIt find_if( InputIt first, InputIt last, UnaryPredicate p );

可以看到,std::findif需要三个参数,分别是要查找的区间的头和尾迭代器,以及一个一元谓词函数。函数返回第一个使谓词函数返回 true 的元素迭代器,如果找不到,则返回 last。

以下是扫描std::vector的示例:

#include 
#include 
   
#include 
    

template
     
bool is_even(T i) {
    return i % 2 == 0;
}

int main() {
    std::vector
       nums { 1, 3, 4, 5, 9 };
    auto result = std::find_if(nums.begin(), nums.end(), [](int n) {
        return n % 2 == 0;
    });
    if (result != nums.end()) {
        std::cout << "The first even number is: " << *result << "\n";
    } else {
        std::cout << "No even numbers found\n";
    }
    
    return 0;
}

      
     
    
   
  

以上代码中,is_even函数是一个返回数字类型是否是偶数的谓词函数,这里我们使用Lambda表达式直接用于查找中。

二、std::find和find_if的区别

两者最大的区别在于,std::find只能查找相等的元素,而std::findif可以根据精确或模糊条件查找,称为谓词。

以下是一个示例:

#include 
#include 
   
#include 
    

int main() {
    std::vector
      nums { 1, 3, 4, 5, 9 };
    auto result = std::find(nums.begin(), nums.end(), 4);
    if (result != nums.end()) {
        std::cout << "Found " << *result << "\n";
    } else {
        std::cout << "Not found\n";
    }
    return 0;
}

     
    
   
  

上面的代码中,std::find用于查找std::vector中的一个特定数字 4。结果是找到该元素。

三、std::find和std::findif的应用场景

因为std::find和std::findif的差异,它们在应用场景上也有所不同。当且仅当只想查找元素相等的时候,才应该使用std::find。而当需要实现更多细节的调整时,必须使用std::findif。

比如在一个字符串列表中查找以"a"开头的第一个字符串,可以使用以下代码:

auto result = std::find_if(str_list.begin(), str_list.end(), [](std::string str) {
    return !str.empty() && str[0] == 'a';
});

以上代码用到了Lambda表达式和std::string类型的front()函数,以查找第一个以"a"开头的非空字符串。

四、std::find在自定义对象上的应用

在使用std::find查找自定义对象上,需要实现操作符或者是重载 = 运算符,以便该方法可以通过默认行为判断元素是否相等。

以下是实现演示:

#include 
#include 
   
#include 
    

class Person {
public:
    std::string name;
    int age;
    bool operator==(const Person& other) const {
        return name == other.name && age == other.age;
    }
};

int main() {
    std::vector
      people { 
        { "John", 30 }, { "Peter", 25 }, 
        { "Harry", 50 }, { "Tom", 30 }
    };
    Person search_person { "Peter", 25 };
    auto result = std::find(people.begin(), people.end(), search_person);
    if (result != people.end()) {
        std::cout << "Found person: " << result->name << " " << result->age << "\n";
    } else {
        std::cout << "Person not found\n";
    }
    return 0;
}

     
    
   
  

以上代码中,我们创建了一个自定义类 Person,实现了 == 运算符,因此可以使用std::find查找该类中的一些元素。

五、结语

std::find函数是STL中最常用的函数之一,它可以通过默认行为查找标准数字、字符串和自定义对象等元素。同时,std::findif可以自定义查找的谓词,使用户可以更灵活地控制查找过程。在日常编程中,我们一定会涉及到使用STL库,如果可以熟练掌握常见的STL函数,可以代替自己编写通用函数,提高工作效率。