用于map、vector容器中查找符合条件的记录
函数原型
template <class InputIterator, class Predicate>
InputIterator find_if(InputIterator first, InputIterator last,Predicate pred)
{
while (first != last && !pred(*first)) ++first;
return first;
}
predicate是比较函数
工作中使用这个函数踩过坑,他返回的是一个迭代器,而非值
若找不到元素,则返回的是end ()迭代器,若容器元素为int,则 *end()为 0,并非是vector中的元素,不要误解了
#include <iostream> // std::cout
#include <algorithm> // std::find_if
#include <vector> // std::vector
using namespace std;
//自定义一元谓词函数
bool isOdd(int i) {
return ((i % 2) == 1);
}
//以函数对象的形式定义一个 find_if() 函数的查找规则
class vector_finder
{
public:
vector_finder(const int a):m_i_a(a){}
bool operator ()(const int &value)
{
return value == m_i_a;
}
private:
int m_i_a;
};
int main() {
vector<int> myvector{ 4,2,3,1,5 };
//调用 find_if() 函数,并以 IsOdd() 一元谓词函数作为查找规则
vector<int>::iterator it = find_if(myvector.begin(), myvector.end(), isOdd);
if (it == myvector.end())
printf("not found\n");
else
{
cout << "first Odd = " << *it<<endl;
}
vector<int>::iterator ai = find_if(myvector.begin(), myvector.end(), vector_finder(9));
if (ai == myvector.end())
{
printf("not found\n");
}
else
{
cout << "find element" << *ai<<endl;
}
return 0;
}
IsOdd 是一个一元谓词比较。
vector_finder 是声明一个对象,传入参数,构造对象进行比较。