简单记录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)中的对象类型一致即可。