一、判断值是否存在:

        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;

}

posted on 2012-07-24 09:48  cchun  阅读(3009)  评论(0编辑  收藏  举报