首先,选择查找算法时,区间是否排序是一个至关重要的因素。
可以按是否需要排序区间分为两组:
 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. js有关时间日期的操作

    var myDate = new Date();var date_string = myDate.getFullYear()+""+((myDate.getMonth()+1)&l ...

  2. php 连续留存与留存人数计算

    for($i = 0;$i <= $interval;$i++) { $res = $model->turnround($today,$tomorrow,$flag); $temp = a ...

  3. C#基础----Linq之List<T>篇

    最近有用到List处理排序以及分页的问题.想想还是写一个博客记录一下.以下围绕Person类实现,Person类只有Name和Age两个属性   一.List<T>排序 1.1 List& ...

  4. RSA Study

    These days I study the RSA Algorithm. It is a little complex, but not very. Also, my study has not f ...

  5. 使用Windows Azure的VM安装和配置CDH搭建Hadoop集群

    本文主要内容是使用Windows Azure的VIRTUAL MACHINES和NETWORKS服务安装CDH (Cloudera Distribution Including Apache Hado ...

  6. url 特殊字符

    URL中的特殊字符 有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了.编码的格式为:%加字符的ASCII码,即一个百分号%,后面跟对应字符的ASCII(1 ...

  7. app微信支付(一) - 微信支付基本业务流程解析

    想必微信支付是现在很多朋友离不开的一个功能,不论是扫描支付还是公众号支付或者app端支付,基本的思路都是一样的,之前做过支付宝支付以及中国移动支付接口,这几天花时间讲讲微信支付吧 先看一下微信支付的时 ...

  8. 输出国际象棋&&输出余弦曲线

    输出国际象棋棋盘 #include <stdio.h> #include <stdlib.h> #include <windows.h> int main(){ i ...

  9. maven操作

    Java 编程入门(系列)      Python数据分析与挖掘经典案例实战      "我的2016"主题征文活动 关闭 maven仓库--私服(Nexus的配置使用) 2013 ...

  10. guava常用操作

    Jack47 我思故我在 Google Java编程库Guava介绍 本系列想介绍下Java下开源的优秀编程库--Guava[ˈgwɑːvə].它包含了Google在Java项目中使用一些核心库,包含 ...