您的位置:首页 > 其它

STL的二分查找binary_search

2012-07-24 09:48 316 查看
一、判断值是否存在:

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: