简单记录find_if

 

find_if实现(模板函数)

 

 

 

 

#include <iostream>

#include <vector>
#include <memory> #include <algorithm> class Test { public: void SetNum(int num) { _num = num; }; int GetNum() { return _num; }; void SetSring(const std::string& str) { _string = str; }; std::string GetString() { return _string; }; private: int _num; std::string _string; }; class VetFinder { public: VetFinder(const std::string& ss) { _str = ss; }; bool operator()(std::shared_ptr<Test> tt) { return tt->GetString() == _str; } private: std::string _str; }; inline bool FinderFun(std::shared_ptr<Test> tt) { return tt->GetNum()== 200; } int main() { Test t1; t1.SetNum(1); t1.SetSring("string1"); Test t2; t2.SetNum(2); t2.SetSring("string2"); Test t3; t3.SetNum(3); t3.SetSring("string3"); std::vector<std::shared_ptr<Test>> vet; vet.emplace_back(std::make_shared<Test>(t1)); vet.emplace_back(std::make_shared<Test>(t2)); vet.emplace_back(std::make_shared<Test>(t3)); for (auto& iter : vet) { std::cout << "num: " << iter->GetNum() << " string:" << iter->GetString(); std::cout << std::endl; } //auto it=std::find_if(vet.begin(), vet.end(), VetFinder("string5")); //auto it = std::find_if(vet.begin(), vet.end(), FinderFun); auto it = std::find_if(vet.begin(), vet.end(), [](std::shared_ptr<Test> tt) { return tt->GetNum() == 3; }); if (it == vet.end()) { std::cout << "yes"; } else { std::cout << "no"; } return 0; }

 

备注:

1、已知查询目标,可用普通函数,lambda表达式。比如X==Y;X>=Y等。

2、未知查询目标,也不知容器内部范围,选用函数对象(仿函数)。如VetFinder("string5"),内部步骤:

  1)调用构造函数先将"string2"初始化到_str;

  2)fing_if内部有循环函数(见find_if源码),不断将vector中的对象遍历,比较。

 3、仿函数的参数定义:只需保持与容器(vector)中的对象类型一致即可。

 

posted @ 2021-12-07 16:17  gd_沐辰  阅读(91)  评论(0编辑  收藏  举报