C++STL有好幾種查找算法,但是他們的用法上有很多共同的地方:
1、除了binary_search的返回值是bool之外(查找的了返回true,否則返回false),其他所有的查找算法返回值都是一個迭代器(查找成功返回目標所在迭代器的位置,否則返回最后一個元素的后一個位置或者說是容器的end())
2、查找算法經常會用到迭代器區間,注意區間是前閉后開的
3、所有查找函數中如果存在兩個區間,第一個區間是被查找對象的區間,第二個是目標對象的區間,如果只有一個區間則是被查找對象的區間。
4、對於有序查找的3個函數,一定要事先排序,否則可能直接返回查找不到,不要與真的不存在該元素混淆掉
分類:
查找單個元素find、find_if
查找子區間 search、search_n、find_end,其中find_end和search功能一樣,只不過是從后往前查找
搜索子區間中的一個值find_first_of
有序區間的查找算法binary_search,lower_bound,upper_bound,注意這類查找一定要有序,否則返回錯誤
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 int main() 5 { 6 //查找操作經常會用到迭代器區間,一定要注意前閉后開,找不到的時候就返回最后一個位置 7 //輸入參數是一個迭代器區間和要查找的值,如果查找成功返回第一個目標值的迭代器位置,查找失敗返回區間所在的最后位置的后一個 8 //注意:迭代器區間是前閉后開的,如迭代區間為[1,100),那么查找下標為1-99對應的值,如果查找失敗則返回100下標對應的迭代器 9 int num[10]={0,1,2,8,4,7,5,7}; 10 //*******查找單個元素find、find_if********************************// 11 //_InIt find(_InIt _First, _InIt _Last, const _Ty& _Val) 12 //這里偷個小懶,沒有使用STL中的容器和迭代器,而是使用數組和指針代替了 13 int *p; 14 p=find(num,num+8,7); 15 if((p-num)>7) 16 { 17 cout<<"沒有這個值"<<endl; 18 } 19 else 20 { 21 cout<<"第一個7所在的下標是"<<p-num<<endl; 22 } 23 24 p=find(num,num+8,3); 25 if((p-num)>7) 26 { 27 cout<<"沒有這個值"<<endl; 28 } 29 else 30 { 31 cout<<"第一個3所在的下標是"<<p-num<<endl; 32 } 33 34 //find_if需要使用到綁定器和STL中的函數對象,這里先不寫程序了 35 36 37 //******************查找子區間 search、search_n、find_end**********************// 38 //_FwdIt1 search(_FwdIt1 _First1, _FwdIt1 _Last1,_FwdIt2 _First2, _FwdIt2 _Last2) 39 int num1[10]={2,8,4}; 40 p=search(num,num+8,num1,num1+3); 41 if((p-num)>7) 42 { 43 cout<<"沒有這個區間的數"<<endl; 44 } 45 else 46 { 47 cout<<"第一個num1所在num中下標是"<<p-num<<endl; 48 } 49 //find_end和search一樣,只不過是從后往前查 50 p=find_end(num,num+8,num1,num1+3); 51 if((p-num)>7) 52 { 53 cout<<"沒有這個區間的數"<<endl; 54 } 55 else 56 { 57 cout<<"最后一個num1所在num中下標是"<<p-num<<endl; 58 } 59 60 //find_end和search一樣,只不過是從后往前查 61 62 //search_n查找具有相同的n個值的位置 63 //_FwdIt1 search_n(_FwdIt1 _First1, _FwdIt1 _Last1,_Diff2 _Count, const _Ty& _Val) 64 int num2[10]={1,6,6,6,5,6,6,6,6,3}; 65 p=search_n(num2,num2+10,4,6); 66 if((p-num2)>10) 67 { 68 cout<<"沒有這個區間的數"<<endl; 69 } 70 else 71 { 72 cout<<"第一個符合條件的目標所在num中下標是"<<p-num2<<endl; 73 } 74 75 //******************搜索子區間中的一個值find_first_of**********************// 76 //find_first_of 77 //_FwdIt1 find_first_of(_FwdIt1 _First1, _FwdIt1 _Last1,_FwdIt2 _First2, _FwdIt2 _Last2, _Pr _Pred) 78 int fnum1[10]={1,5,6,4,8,6,1,4,6,5}; 79 int fnum2[10]={7,77,10,5,4,6}; 80 p=find_first_of(fnum1,fnum1+10,fnum2,fnum2+10); 81 if((p-fnum1)>10) 82 { 83 cout<<"沒有匹配的值"<<endl; 84 } 85 else 86 { 87 cout<<"第一個符合條件的目標所在fnum1中下標是"<<p-fnum1<<endl; 88 } 89 90 //******************有序區間的查找算法binary_search,lower_bound,upper_bound**********************// 91 //binary_search 92 //bool binary_search(_FwdIt _First, _FwdIt _Last, const _Ty& _Val) 93 //注意二分查找返回值是bool類型, 94 //只能判斷要查找的元素在不在所在區間,不能返回位置,根據其原理,因為他是跳躍式查找,沒法確定哪一個是第一次出現的目標 95 int bnum[10]={1,2,3,4,6,8,10,15,19}; 96 cout<<binary_search(bnum,bnum+9,8); 97 //upper_bound查找第一個比目標大的值,返回所在位置的迭代器 98 //_FwdIt upper_bound(_FwdIt _First, _FwdIt _Last, const _Ty& _Val) 99 p=upper_bound(bnum,bnum+9,9); 100 if((p-bnum)>9) 101 { 102 cout<<"沒有匹配的值"<<endl; 103 } 104 else 105 { 106 cout<<"第一個符合條件的目標所在bnum中下標是"<<p-bnum<<endl; 107 } 108 //lower_bound查找第一個比目標小的值,返回所在位置的迭代器 109 return 0; 110 }