std::find_if
std::find_if
参考文档:cppReference
template <class InputIterator, class UnaryPredicate>
InputIterator find_if(InputIterator first, InputIterator last, UnaryPredicate pred);
UnaryPredicate(一元谓词):其实就是一元函数
该算法的语义就是,在[first,last)中查找满足pred条件的第一个元素
若存在,返回其迭代器;若不存在,返回last
pred是一个一元函数,接受一个迭代器所指向类型的参数;该函数返回值为bool类型,若迭代器满足条件,则返回true
该算法就是遍历给出的迭代器范围,逐个应用pred;其语义与下面等价
template<class InputIterator, class UnaryPredicate>
InputIterator find_if(InputIterator first, InputIterator last, UnaryPredicate pred)
{
while(first != last){
if(pred(*first)) return first; // 核心;注意,此处已经对迭代器进行解引用
++first;
}
return last;
}
注意,pred的参数类型不是迭代器,而是迭代器指向元素的类型
bool pred(T element);
举个例子
在vec中,找到第一个等于4的元素
bool findEle(int el)
{ return el == 4; }
int main()
{
vector<int> vec{7, 8, 9, 3, 5, 4};
auto it = find_if(vec.begin(), vec.end(), findEle);
if(it != vec.end())
cout << *it << endl;
return 0;
}
使用多元函数作为判断谓词
其实pred可以使用不止一个参数
但是,因为迭代器作为pred的第一个参数,无法手动调用;因此就需要std::functional进行辅助
bool findEle(int el, int val) { return el == val; }
int val;
std::bind(findEle, _1, val); // 此时该函数对象就可以作为判断谓词了
auto it = find_if(first, last, std::bind(findEle, _1, val));
占位符_1位于命名空间
std::placeholder中
此处的_1代表的是*first,也就是说用迭代器范围中的元素替换_1
使用多元判断谓词,可以使得判断条件更加的灵活
例如上面这种方式,可以改变val来改变选择条件
可以通过bind,在pred上绑定多个参数
bool findEle(int el, int low, int high) { return low <el && el < high; }
int low = 5, high = 8;
auto it = find_if(first, last, std::bind(findEle, _1, low, high)); // 在vec中查找第一个大于low小于high的元素
常见错误
误将判断函数的参数类型设为迭代器类型


浙公网安备 33010602011771号