C++ STL之查找算法


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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM