<algorithm>
头文件中。因此在使用它们之前,程序中要先引入此头文件:
#include <algorithm>
bool mycomp(int i) { return ((i%2)==1); }上面的 mycomp() 就是一个一元谓词函数,其可用来判断一个整数是奇数还是偶数。
也可以是一个函数对象,比如:如果读者想更深层次地了解 C++ 谓词函数,可阅读《C++谓词函数》一节。
//以函数对象的形式定义一个 find_if() 函数的查找规则 class mycomp2 { public: bool operator()(const int& i) { return ((i % 2) == 1); } };此函数对象的功能和 mycomp() 函数一样。
InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred);
其中,first 和 last 都为输入迭代器,其组合 [first, last) 用于指定要查找的区域;pred 用于自定义查找规则。同时,该函数会返回一个输入迭代器,当查找成功时,该迭代器指向的是第一个符合查找规则的元素;反之,如果 find_if() 函数查找失败,则该迭代器的指向和 last 迭代器相同。值得一提的是,由于 first 和 last 都为输入迭代器,意味着该函数适用于所有的序列式容器。甚至当采用适当的谓词函数时,该函数还适用于所有的关联式容器(包括哈希容器)。
#include <iostream> // std::cout #include <algorithm> // std::find_if #include <vector> // std::vector using namespace std; //自定义一元谓词函数 bool mycomp(int i) { return ((i % 2) == 1); } //以函数对象的形式定义一个 find_if() 函数的查找规则 class mycomp2 { public: bool operator()(const int& i) { return ((i % 2) == 1); } }; int main() { vector<int> myvector{ 4,2,3,1,5 }; //调用 find_if() 函数,并以 IsOdd() 一元谓词函数作为查找规则 vector<int>::iterator it = find_if(myvector.begin(), myvector.end(), mycomp2()); cout << "*it = " << *it; return 0; }程序执行结果为:
*it = 3
结合程序执行结果不难看出,对于 myvector 容器中的元素 4 和 2 来说,它们都无法使 (i%2)==1 这个表达式成立,因此 mycomp2() 返回 false;而对于元素 3 来说,它可以使 mycomp2() 函数返回 true,因此,find_if() 函数找到的第一个元素就是元素 3。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; }
InputIterator find_if_not (InputIterator first, InputIterator last, UnaryPredicate pred);
其中,first 和 last 都为输入迭代器,[first, last) 用于指定查找范围;pred 用于自定义查找规则。同样,该函数也会返回一个输入迭代器,当 find_if_not() 函数查找成功时,该迭代器指向的是查找到的那个元素;反之,如果查找失败,该迭代器的指向和 last 迭代器相同。和 find_if() 函数一样,find_if_not() 函数也适用于所有的容器,包括所有序列式容器和关联式容器。
#include <iostream> // std::cout #include <algorithm> // std::find_if_not #include <vector> // std::vector using namespace std; //自定义一元谓词函数 bool mycomp(int i) { return ((i % 2) == 1); } int main() { vector<int> myvector{4,2,3,1,5}; //调用 find_if() 函数,并以 mycomp() 一元谓词函数作为查找规则 vector<int>::iterator it = find_if_not(myvector.begin(), myvector.end(), mycomp); cout << "*it = " << *it; return 0; }程序执行结果为:
*it = 4
可以看到,由于第一个元素 4 就不符合 (i%2)==1,因此 find_if_not() 成功找到符合条件的元素,并返回一个指向该元素的迭代器。template<class InputIterator, class UnaryPredicate> InputIterator find_if_not (InputIterator first, InputIterator last, UnaryPredicate pred) { while (first!=last) { if (!pred(*first)) return first; ++first; } return last; }
Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有