首先,选择查找算法时,区间是否排序是一个至关重要的因素。
可以按是否需要排序区间分为两组:
 A. count,find
 B. binary_search,lower_bound,upper_bound,equal_range
A组不需排序区间, B组需要排序区间。
当一个区间被排序,优先选择B组,因为他们提供对数时间的效率。而A则是线性时间(其实就是从头到尾进行遍历)。

另外A组B组所依赖的查找判断法则不同,A使用相等性法则(查找对象需要定义operator==), B使用等价性法则(查找对象需要定义operator<,必须在相等时返回false)。

A组的区别
count:计算对象区间中的数目。
find:返回第一个对象的位置。
查找成功的话,find会立即返回,count不会立即返回(直到查找完整个区间),此时find效率较高。
因此除非是要计算对象的数目,否则不考虑count。

B组的区别

在排完序的数组中查找元素x,如何描述元素x的位置:用lower_bound表示x的下界,用upper_bound表示x的上界.也就是说要用一个区间来表示元素x的位置[lower_bound,upper_bound).看清楚了,这是一个前闭后开区间

binary_search:判断是否存在某个对象,并不能确定要查找的元素的位置.
lower_bound: 返回>=对象的第一个位置;
upper_bound: 返回>对象的第一个位置;
equal_range: 返回由lower_bound和upper_bound返回值构成的pair,也就是所有等价元素区间。

int lower(int *a, int sz, int x){
    , r = sz;
    while (l^r){
        ;
        ;
        else r=mid;
    }
    return l;
}
int upper(int *a, int sz, int x){
    , r = sz;
    while (l^r){
        ;
        ;
        else r = mid;
    }
    return l;
}

如上代码所示,lower_bound和upper_bound的区别就在于左指针l是小于还是小于等于.

二分代码有一个关键的地方:必须让l=mid+1.而不能写成l=mid,因为这会导致一个死循环:当l+1=r时,mid=(l+r)>>1=l.这就导致l,r不再发生变化,成死循环了.

equal_range有两个需要注意的地方:
 1. 如果返回的两个迭代器相同,说明查找区间为空,没有这样的值
 2. 返回迭代器间的距离与迭代器中对象数目是相等的,对于排序区间,他完成了count和find的双重任务

3.因为equal_range的作用相当于lower_bound和upper_bound之和,所以如果用到这两者时,尽量用equal_range,这样的效率为lgn,而分开使用的复杂度为2*lgn.

,,,,,,};
    ;
    pair<);
    cout << ans.first - a << " " << ans.second - a << endl;

输出2 5

STL中algorithm里的查找的更多相关文章

  1. STL中vector的赋值,遍历,查找,删除,自定义排序——sort,push_back,find,erase

    今天学习网络编程,那个程序中利用了STL中的sort,push_back,erase,自己没有接触过,今天学习一下,写了一个简单的学习程序.编译环境是VC6.0         这个程序使用了vect ...

  2. STL中的二分查找———lower_bound,upper_bound,binary_search

    关于STL中的排序和检索,排序一般用sort函数即可,今天来整理一下检索中常用的函数——lower_bound , upper_bound 和 binary_search . STL中关于二分查找的函 ...

  3. STL中的二分查找

    本文转载于https://blog.csdn.net/riba2534/article/details/69240450 使用的时候注意:必须用在非递减的区间中 二分查找的原理非常简单,但写出的代码中 ...

  4. C++ STL中的Binary search(二分查找)

    这篇博客转自爱国师哥,这里给出连接https://www.cnblogs.com/aiguona/p/7281856.html 一.解释 以前遇到二分的题目都是手动实现二分,不得不说错误比较多,关于返 ...

  5. STL中的二分查找——lower_bound 、upper_bound 、binary_search

    STL中的二分查找函数 1.lower_bound函数 在一个非递减序列的前闭后开区间[first,last)中.进行二分查找查找某一元素val.函数lower_bound()返回大于或等于val的第 ...

  6. STL中的algorithm

    STL中的algorithm #include<algorithm>中的泛函算法,需要添加头文件. 搜索算法:find() .search() .count() .find_if() .s ...

  7. STL中list用法

    本文以List容器为例子,介绍了STL的基本内容,从容器到迭代器,再到普通函数,而且例子丰富,通俗易懂.不失为STL的入门文章,新手不容错过! 0 前言 1 定义一个list 2 使用list的成员函 ...

  8. c++ STL中的vector与list为什么没有提供find操作?

    map里有,set里也有,vector,list没有,太不公平了吧. 其实应该考虑为什么map,set里有find操作. include<algorithm>里有通用的find操作,通用的 ...

  9. STL中map与hash_map容器的选择收藏

    这篇文章来自我今天碰到的一个问题,一个朋友问我使用map和hash_map的效率问题,虽然我也了解一些,但是我不敢直接告诉朋友,因为我怕我说错了,通过我查询一些帖子,我这里做一个总结!内容分别来自al ...

随机推荐

  1. WIN 下的超动态菜单(二)用法

    WIN 下的超动态菜单(一)简介 WIN 下的超动态菜单(二)用法 WIN 下的超动态菜单(三)代码 作者:黄山松,发表于博客园:http://www.cnblogs.com/tomview/     ...

  2. AStar算法的学习

    摘自:http://www.cnblogs.com/hxsyl/p/3994730.html A*算法的java实现 import java.util.ArrayList; import java.u ...

  3. django用户登录和注销

    django版本:1.4.21. 一.准备工作 1.新建项目和app [root@yl-web-test srv]# django-admin.py startproject lxysite [roo ...

  4. js中的冒泡排序以及实现一个数组中得最到最大的数字小例

    这其实是一个很简单的js就可以实现,当然一般情况就是利用for循环,从第一个跟第二个开始比较,根据大小交互位置,思路很简单. 也就是js中的冒泡排序 冒泡排序 时间复杂度为O(n^2),有两个优点: ...

  5. Codeforces 461B. Appleman and Tree[树形DP 方案数]

    B. Appleman and Tree time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  6. [No00003F]richtextbox实现拖放

    namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { Initialize ...

  7. 转:Eclipse SVN插件比较 Subclipse vs Subversive

    结论:还是用久经考验的 Subclipse http://www.wkii.org/eclipse-svn-plugins-subclipse-vs-subversive.html

  8. poj[2392]space elevator

    Description The cows are going to space! They plan to achieve orbit by building a sort of space elev ...

  9. 《ASP.NET MVC 5 高级编程(第5版)》

    第1章.入门 本章主要内容: ASP.NET MVC 5概述 其应用程序的创建方法 其应用程序的及结构 概述:将MVC设计模式应用于ASP.NET框架 ASP.NET 1.0支持两层抽象: Syste ...

  10. checkbox与jq<转>

    题:经常使用jQuery插件的attr方法获取checked属性值,获取的值的大小为未定义,此时可以用prop方法获取其真实值,下面介绍这两种方法的区别: 1.通过prop方法获取checked属性, ...