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 }
时间: 2024-10-09 02:28:17

C++ STL之查找算法的相关文章

STL常用查找算法介绍

adjacent_find() 在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的迭代器.否则返回past-the-end. #include <iostream> #include <cstdio> #include <algorithm> #include <vector> using namespace std; void play_adjacent_find() { vector<int> v1

c++之STL(13) STL 算法 - 查找算法(4)find_first_of(b,e,sb,se) find_first_of(b,e,sb,se,bp)

find_first_of(b,e,sb,se) find_first_of(b,e,sb,se,bp) 使用逆向迭代器 没有find_last_of算法 STL 查找算法 find() find_if() search_n() search() find_end() find_first_of() adjacent_find() string 查找函数和STL查找算法的比较 string函数    STL算法 find()                find() rfind()      

STL中的查找算法

STL中有很多算法,这些算法可以用到一个或多个STL容器(因为STL的一个设计思想是将算法和容器进行分离),也可以用到非容器序列比如数组中.众多算法中,查找算法是应用最为普遍的一类. 单个元素查找 1. find() 比较条件为元素是否相等的查找: template <class InputIterator, class T> InputIterator find (InputIterator first, InputIterator last, const T& val); 2.fi

STL源码剖析——STL算法之find查找算法

前言 由于在前文的<STL算法剖析>中,源码剖析非常多,不方便学习,也不方便以后复习,这里把这些算法进行归类,对他们单独的源码剖析进行讲解.本文介绍的STL算法中的find.search查找算法.在STL源码中有关算法的函数大部分在本文介绍,包含findand find_if.adjacent_find.search.search_n.lower_bound. upper_bound. equal_range.binary_search.find_first_of.find_end相关算法,下

STL算法总结之查找算法示例

STL算法总结之查找算法示例 1.adjacent_find: // 所有容器适用(线性的) adjacent_find(begin,end); adjacent_find(begin,end,Predicate); 在范围[first,last)之间寻找第一次出现的两个连续相等的元素,如果存在,则返回指向第一个元素迭代器,否则返回last.还可以使用自己定义的二元断言(就是自定义的判断方法) #include<vector> #include<iostream> #include

c++之STL(13) STL 算法 - 查找算法(1)

常用的查找算法如下: find() find_if() // search_n() search() find_end() find_first_of() adjacent_find() // 这两种方法通用,对所有容器试用,但是查找效率慢,是线性查找 find() 此复杂度是线性复杂度 find_if() 此复杂度是线性复杂度 注意: 1,如果是已序区间,可以使用  已序区间查找算法(binary_search includes()  lower_bound()  upper_bound())

c++STL之常用查找算法

引入#include<algorithm> 算法简介: find:查找元素 find_if:按条件查找 adjacent_find:查找相邻房重复的元素 binary_search:二分查找 count:统计元素个数 count_if:按条件统计元素个数 1.find #include<iostream> using namespace std; #include <vector> #include <algorithm> #include <stri

[Data Structure &amp; Algorithm] 七大查找算法

查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找.本文简单概括性的介绍了常见的七种查找算法,说是七种,其实二分查找.插值查找以及斐波那契查找都可以归为一类——插值查找.插值查找和斐波那契查找是在二分查找的基础上的优化查找算法.树表查找和哈希查找会在后续的博文中进行详细介绍. 查找定义:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录). 查找算法分类: 1)静态查找和动态查找: 注:静态或者动态都是针对查找表而言

针对范围对的高效查找算法设计(不准用数组)

题目链接在:针对一群范围对的最快查找算法设计(不要用数组),是我目前遇到的一个较棘手的问题. 描述如下: 假如有一群范围对,格式为:<范围表示,该范围对应的结果值>,设计一个最快查找算法,使得给定一个值,输出该值所在范围对的结果值. 注意:范围对之间没有交集,即不可能存在<1, 10>和<2, 11>这样的两个范围对. 例如有以下几个范围对: <<1, 2>, 20> <<3, 37>, 27> <<48, 5