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;

    }

  • 相关阅读:
    向量杂谈
    对widget使用WM_SetCallback
    群延迟与广义线性相位
    采样的频域表示
    Oracle 表的连接方式(2)-----HASH JOIN的基本机制1
    Oracle 表的连接方式(1)-----Nested loop join和 Sort merge join
    Oracle 表的访问方式(2)-----索引扫描
    Oracle 表的访问方式(1) ---全表扫描、通过ROWID访问表
    11g RAC R2 之Linux DNS 配置
    11g RAC r2 的启停命令概述1
  • 原文地址:https://www.cnblogs.com/cchun/p/2605991.html
Copyright © 2011-2022 走看看