Bootstrap

C++的find和find_if函数

一、find()算法

[cpp]  view plain  copy
 print ?
  1. template<class InputIterator, class T>  
  2.   InputIterator find ( InputIterator first, InputIterator last, const T& value )  
  3.   {  
  4.     for ( ;first!=last; first++) if ( *first==value ) break;  
  5.     return first;  
  6.   }  
返回区间[first,end)中第一个值等于value的元素的位置。

如果没有找到匹配元素,则返回end。

复杂度:线性复杂度。最多比较次数是:元素的总个数。

程序实例:

下面的程序在int类型的vector中搜寻元素5和12,如果搜索到,就返回其位置if欧泽输出提示信息。

main.cpp(头文件algostuff.h和上一篇博客中的相同):

[cpp]  view plain  copy
 print ?
  1. #include "algostuff.h"  
  2.   
  3. using namespace std;  
  4.   
  5. int main()  
  6. {  
  7.     vector<int> intVec;  
  8.   
  9.     INSERT_ELEMENTS(intVec,1,9);  
  10.   
  11.     vector<int>::iterator pos;  
  12.     pos = find(intVec.begin(),intVec.end(),5);  
  13.   
  14.     if(pos != intVec.end())  
  15.         cout << "The value 5 exists,and its position is " <<  
  16.         distance(intVec.begin(),pos) + 1 << endl;  
  17.     else  
  18.         cout << "The value 4 not found!" << endl;  
  19.   
  20.     pos = find(intVec.begin(),intVec.end(),12);  
  21.   
  22.     if(pos != intVec.end())  
  23.         cout << "The value 12 exists,and its position is " <<  
  24.         distance(intVec.begin(),pos) + 1 << endl;  
  25.     else  
  26.         cout << "The value 12 not found!" << endl;  
  27. }  
运行结果 (头文件 algostuff.h 和上一篇博客中的相同)


二、find_if()算法

[cpp]  view plain  copy
 print ?
  1. template<class InputIterator, class Predicate>  
  2.   InputIterator find_if ( InputIterator first, InputIterator last, Predicate pred )  
  3.   {  
  4.     for ( ; first!=last ; first++ ) if ( pred(*first) ) break;  
  5.     return first;  
  6.   }  
它在区间[first,end)中搜寻使一元判断式pred为true的第一个元素。

如果没找到,返回end。

程序实例:

下面程序找出第一个能够被3整除的元素,如果找到返回其位置。

main.cpp:

[cpp]  view plain  copy
 print ?
  1. #include "algostuff.h"  
  2.   
  3. using namespace std;  
  4.   
  5. int main()  
  6. {  
  7.     vector<int> intVec;  
  8.   
  9.     INSERT_ELEMENTS(intVec,1,9);  
  10.   
  11.     vector<int>::iterator pos;  
  12.     pos = find_if(intVec.begin(),intVec.end(),  
  13.         not1(bind2nd(modulus<int>(),3)));  
  14.   
  15.     if(pos != intVec.end())  
  16.         cout << "The value divided by 3 exists,and the first value's position is " <<  
  17.         distance(intVec.begin(),pos) + 1 << endl;  
  18.     else  
  19.         cout << "The value divided by 3 not found!" << endl;  
  20. }  
运行结果:

;