本文共 2909 字,大约阅读时间需要 9 分钟。
find
和find_if
是C++标准库中用于容器中的元素查找的强大工具。find
用于查找特定的值,而find_if
用于查找满足自定义条件的元素。两者都使用迭代器进行操作,对于支持random-access iterator的容器(如vector和list)效率更高。
std::find
函数用于查找具有指定值的元素。以下是一个基本的例子:
#include#include using namespace std;int main() { vector lst; lst.push_back(10); lst.push_back(20); lst.push_back(30); iterator it = find(lst.begin(), lst.end(), 10); if (it != lst.end()) { // 查找成功 } else { // 未找到 } return 0;}
当查找的对象是类对象时,可以通过重载==
操作符来实现比较。例如:
class CPerson {public: CPerson() {} ~CPerson() {} bool operator==(const CPerson &rhs) const { return this->age == rhs.age; } int age;};listlst;CPerson cp_to_find;cp_to_find.age = 50;iterator it = find(lst.begin(), lst.end(), cp_to_find);
find_if
函数用于查找满足特定条件的元素。第三个参数是一个谓词函数,返回bool值。
#include#include using namespace std;class CPerson {public: CPerson() {} ~CPerson() {} bool operator==(const CPerson &rhs) const { return this->age == rhs.age; } int age;};typedef struct finder_t { finder_t(int n) : age(n) {} bool operator()(const CPerson *p) { return p->age == age; } int age;};int main() { list
lst; iterator it = find_if(lst.begin(), lst.end(), finder_t(50));}
在C++中,bind
函数用于将二元谓词转换为一元谓词。可以使用bind2nd
将一个函数的一部分参数进行绑定,常用于实现自定义查找逻辑。
#include#include #include using namespace std;struct testStruct { int a; int b;};vector testStructVector;auto itrFind = find_if(testStructVector.begin(), testStructVector.end(), [](testStruct myStruct) { return myStruct.a > 2 && myStruct.b < 8; });
以下是通过自定义函数执行查找的示例:
#include#include
以下是一个使用绑定器的示例,展示了如何将一个比较函数绑定到find_if
上:
#include#include #include using namespace std;struct compare { bool operator()(A value, string str) const { return value.GetStr() == str; }};vector a;auto t = find_if(a.begin(), a.end(), bind2nd(compare(), "33"));
std::find
和std::find_if
函数是C++标准库中的实力强大的工具,能够满足大多数的元素查找需求。理解并正确使用这些函数的区别和优点,将有助于提高代码的效率和简洁性。
转载地址:http://hqndz.baihongyu.com/