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的元素

常见错误

误将判断函数的参数类型设为迭代器类型
image

posted @ 2024-04-18 14:29  lifeAddicted  阅读(81)  评论(0)    收藏  举报