一、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函数,可以代替自己编写通用函数,提高工作效率。