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,注意这类查找一定要有序,否则返回错误

 #include<iostream>
#include<algorithm>
using namespace std;
int main()
{
//查找操作经常会用到迭代器区间,一定要注意前闭后开,找不到的时候就返回最后一个位置
//输入参数是一个迭代器区间和要查找的值,如果查找成功返回第一个目标值的迭代器位置,查找失败返回区间所在的最后位置的后一个
//注意:迭代器区间是前闭后开的,如迭代区间为[1,100),那么查找下标为1-99对应的值,如果查找失败则返回100下标对应的迭代器
int num[]={,,,,,,,};
//*******查找单个元素find、find_if********************************//
//_InIt find(_InIt _First, _InIt _Last, const _Ty& _Val)
//这里偷个小懒,没有使用STL中的容器和迭代器,而是使用数组和指针代替了
int *p;
p=find(num,num+,);
if((p-num)>)
{
cout<<"没有这个值"<<endl;
}
else
{
cout<<"第一个7所在的下标是"<<p-num<<endl;
} p=find(num,num+,);
if((p-num)>)
{
cout<<"没有这个值"<<endl;
}
else
{
cout<<"第一个3所在的下标是"<<p-num<<endl;
} //find_if需要使用到绑定器和STL中的函数对象,这里先不写程序了 //******************查找子区间 search、search_n、find_end**********************//
//_FwdIt1 search(_FwdIt1 _First1, _FwdIt1 _Last1,_FwdIt2 _First2, _FwdIt2 _Last2)
int num1[]={,,};
p=search(num,num+,num1,num1+);
if((p-num)>)
{
cout<<"没有这个区间的数"<<endl;
}
else
{
cout<<"第一个num1所在num中下标是"<<p-num<<endl;
}
//find_end和search一样,只不过是从后往前查
p=find_end(num,num+,num1,num1+);
if((p-num)>)
{
cout<<"没有这个区间的数"<<endl;
}
else
{
cout<<"最后一个num1所在num中下标是"<<p-num<<endl;
} //find_end和search一样,只不过是从后往前查 //search_n查找具有相同的n个值的位置
//_FwdIt1 search_n(_FwdIt1 _First1, _FwdIt1 _Last1,_Diff2 _Count, const _Ty& _Val)
int num2[]={,,,,,,,,,};
p=search_n(num2,num2+,,);
if((p-num2)>)
{
cout<<"没有这个区间的数"<<endl;
}
else
{
cout<<"第一个符合条件的目标所在num中下标是"<<p-num2<<endl;
} //******************搜索子区间中的一个值find_first_of**********************//
//find_first_of
//_FwdIt1 find_first_of(_FwdIt1 _First1, _FwdIt1 _Last1,_FwdIt2 _First2, _FwdIt2 _Last2, _Pr _Pred)
int fnum1[]={,,,,,,,,,};
int fnum2[]={,,,,,};
p=find_first_of(fnum1,fnum1+,fnum2,fnum2+);
if((p-fnum1)>)
{
cout<<"没有匹配的值"<<endl;
}
else
{
cout<<"第一个符合条件的目标所在fnum1中下标是"<<p-fnum1<<endl;
} //******************有序区间的查找算法binary_search,lower_bound,upper_bound**********************//
//binary_search
//bool binary_search(_FwdIt _First, _FwdIt _Last, const _Ty& _Val)
//注意二分查找返回值是bool类型,
//只能判断要查找的元素在不在所在区间,不能返回位置,根据其原理,因为他是跳跃式查找,没法确定哪一个是第一次出现的目标
int bnum[]={,,,,,,,,};
cout<<binary_search(bnum,bnum+,);
//upper_bound查找第一个比目标大的值,返回所在位置的迭代器
//_FwdIt upper_bound(_FwdIt _First, _FwdIt _Last, const _Ty& _Val)
p=upper_bound(bnum,bnum+,);
if((p-bnum)>)
{
cout<<"没有匹配的值"<<endl;
}
else
{
cout<<"第一个符合条件的目标所在bnum中下标是"<<p-bnum<<endl;
}
//lower_bound查找第一个比目标小的值,返回所在位置的迭代器
return ;
}

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

  1. C++ STL 常用查找算法

    C++ STL 常用查找算法 adjacent_find() 在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的迭代器.否则返回past-the-end. ...

  2. STL常用查找算法介绍

    adjacent_find() 在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的迭代器.否则返回past-the-end. #include <io ...

  3. STL中的查找算法

    STL中有很多算法,这些算法可以用到一个或多个STL容器(因为STL的一个设计思想是将算法和容器进行分离),也可以用到非容器序列比如数组中.众多算法中,查找算法是应用最为普遍的一类. 单个元素查找 1 ...

  4. 常用的STL查找算法

    常用的STL查找算法 <effective STL>中有句忠告,尽量用算法替代手写循环:查找少不了循环遍历,在这里总结下常用的STL查找算法: 查找有三种,即点线面: 点就是查找目标为单个 ...

  5. [Data Structure & Algorithm] 七大查找算法

    查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找.本文简单概括性的介绍了常见的七种查找算法,说是七种,其实二分查找.插值查找以及斐波那契查找 ...

  6. 七大查找算法(附C语言代码实现)

    来自:Poll的笔记 - 博客园 链接:http://www.cnblogs.com/maybe2030/p/4715035.html 阅读目录 1.顺序查找 2.二分查找 3.插值查找 4.斐波那契 ...

  7. stl非变易算法(二)

    这里接着上篇stl非变易算法(一)进行总结.主要解析算法函数count.count_if.mismatch.equal.search.search_n以及find_end.给出算法函数的实现及測试用例 ...

  8. STL非变易算法 - STL算法

    欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/1394600460.html 原创:ST ...

  9. 查找算法(Java实现)

    1.二分查找算法 package other; public class BinarySearch { /* * 循环实现二分查找算法arr 已排好序的数组x 需要查找的数-1 无法查到数据 */ p ...

随机推荐

  1. final ,override关键字

    final 有时我们会定义这样一种类,我们不希望其他类继承它,或者不想考虑它是否适合作为一个基类.为了实现这一目的,c++ 11新标准提供了一种防止继承发生的方法,即在类名后跟一个关键字final: ...

  2. python学习小结1:for循环控制语句

    用一个列表来确定for循环的范围 >>> x = [0,1,2,3,4] >>> for i in x: print i, 0 1 2 3 4  循环一个字符串 & ...

  3. 【转】HTTP-only Cookie 脚本获取JSESSIONID的方法

    彻底避免xss攻击的方法. 别人可以通过注入js脚本获取你的session cookie,如果幸运的话还可以获取通过js遍历你的dom树获取你的用户的用户名和密码. 如果只是通过正则表达式验证输入的话 ...

  4. PHP创建XML文件讲解

    <?php   #code by coder_apex 2007-6-15   #自动生成一个如下的XML文件   #   #       <?xml version="1.0& ...

  5. PHP读取xml之cdata讲解

    实例: xss.xml <?xml version="1.0" encoding="UTF-8"?><filters>    <f ...

  6. Splay树再学习

    队友最近可能在学Splay,然后让我敲下HDU1754的题,其实是很裸的一个线段树,不过用下Splay也无妨,他说他双旋超时,单旋过了,所以我就敲来看下.但是之前写的那个Splay越发的觉得不能看,所 ...

  7. PowerDesigner 逆向工程 从SQL文件转换成PDM 从PDM转成CDM

    从SQL文件逆向工程到PDM: ①选择file -> Reverse Engineer - > Database ②在General选项卡中选择MySQL数据库,点击确定. ③using ...

  8. selenium2 安装、简单使用及浏览器启动问题解决汇总

    一.selenium2 安装 1.安装jdk并配置环境变量 jdk需要1.6版本及以上的,这个从网上下载就可以,环境变量的配置前边的随笔整理过就不多说了. 2.安装Firefox,Selenium I ...

  9. c# 组元(Tuple)

    组元是C# 4.0引入的一个新特性,编写的时候需要基于.NET Framework 4.0或者更高版本.组元使用泛型来简化一个类的定义. 先以下面的一段代码为例子: public class Poin ...

  10. 1009 FatMouse' Trade

    FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...