zoukankan      html  css  js  c++  java
  • STL的二分查找binary_search

    一、判断值是否存在:

            binary_search()

            bool binary_search(ForwardIterator first, ForwardIterator last, const LessThanComparable& value);

            bool binary_search(ForwardIterator first, ForwardIteratorlast, const T& value, StrictWeakOrdering comp);

            在[first,last)中查找value,如果找到返回Ture,否则返回False

            二分检索,复杂度O(log(last-first))

    二、可以用区间查找,比如lower_bound()和upper_bound(),甚至还有equal_range(),这个返回的是一个pair型,注意pair里面的两个区间端点都是迭代器。

           如果想用int数组下标来进行运算,那么可以将迭代器转化为小标,这个跟指针转化为下标是一致的,就是当前迭代器减去数组头地址。其实lower_bound与upper_bound的返回值就是equal_range的两个区间端点,注意这个区间是左闭右开区间,即右边的端点是指定元素的下一个位置。如果找不到元素,那么lower_bound的迭代器等于upper_bound的迭代器,这是都是等于大于元素的第一个迭代器。

           下面资料来自:http://www.diybl.com/course/3_program/c++/cppjs/20120110/564588.html

            equal_range是C++ STL中的一种二分查找的算法,试图在已排序的[first,last)中寻找value,它返回一对迭代器i和j,其中i是在不破坏次序的前提下,value可插入的第一个位置(亦即lower_bound),j则是在不破坏次序的前提下,value可插入的最后一个位置(亦即upper_bound),因此,[i,j)内的每个元素都等同于value,而且[i,j)是[first,last)之中符合此一性质的最大子区间
       如果以稍许不同的角度来思考equal_range,我们可把它想成是[first,last)内"与value等同"之所有元素形成的区间A,由于[fist,last)有序(sorted),所以我们知道"与value等同"之所有元素一定都相邻,于是,算法lower_bound返回区间A的第一个迭代器,算法upper_bound返回区间A的最后一个元素的下一个位置,算法equal_range则是以pair的形式将两者都返回
       即使[fist,last)并未含有"与value等同"之任何元素,以上叙述仍然合理,这种情况下,"与value等同"之所有元素形成的,其实是一个空区间,在不破坏次序的情况下,只有一个位置可以插入value,而equal_range所返回的pair,其第一和第二(都是迭代器)皆指向该位置。

    // map::equal_elements

    #include <iostream>

    #include <map>

    using namespace std;

     int main ()

    {

      map<char,int> mymap;

      pair<map<char,int>::iterator,map<char,int>::iterator> ret;

      mymap['a']=10;

      mymap['b']=20;

      mymap['c']=30;

      ret = mymap.equal_range('b');

      cout << "lower bound points to: ";

      cout << ret.first->first << " => " << ret.first->second << endl;

      cout << "upper bound points to: ";

      cout << ret.second->first << " => " << ret.second->second << endl;

      return 0;

    }

  • 相关阅读:
    设计教训。
    爆牙齿的世界杯日记(小组末轮AB组)
    [维多利亚2 MOD] RecoverMingV(Vic2版复明) V1.1.3(201254更新),兼容AHD 2.31beta
    [文明5建筑MOD] Gunpowder Magazine and Firecracker Workshop (火药库与爆竹坊)。祝大家春节快乐!
    IVY Bridge : There's more than 22nm(IVB的新指令)
    ID3D11DeviceContext::Dispatch与numthread笔记
    如何在各个版本的VC及64位下使用CPUID指令
    [x86]SIMD指令集发展历程表(MMX、SSE、AVX等)
    C++AMP的tiled_index线程编号属性笔记
    x264编码参数大测试:09 trellis(crf26)
  • 原文地址:https://www.cnblogs.com/cchun/p/2605991.html
Copyright © 2011-2022 走看看