• 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 }
  • 相关阅读:
    线段树(题集
    T3——拆分自然数
    P1309 瑞士轮
    普通母函数简单使用
    双向广度优先搜索
    秦九韶算法
    P1043-数字游戏
    网站在阿里云备案的详细全过程详细步骤
    从git拉取代码后经常出现maven窗口不见
    SpringBoot入门教程之打成war包在tomcat容器中执行
  • 原文地址:https://www.cnblogs.com/bewolf/p/4424385.html
Copyright © 2020-2023  润新知