博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STL的二分查找binary_search
阅读量:5336 次
发布时间:2019-06-15

本文共 1710 字,大约阅读时间需要 5 分钟。

一、判断值是否存在:

        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的迭代器,这是都是等于大于元素的第一个迭代器。

       下面资料来自::

        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;

}

转载于:https://www.cnblogs.com/cchun/archive/2012/07/24/2605991.html

你可能感兴趣的文章
8.6-8.12学习报告
查看>>
8.20-8.27报告
查看>>
通透理解viewport
查看>>
js格式化 Thu Mar 07 2019 12:00:00 GMT+0800 (中国标准时间) 及相互转化
查看>>
日期多选插件Kalendae.js
查看>>
DataTable 带滚动刷新全选全不选
查看>>
Ajax模拟Form表单提交,含多种数据上传
查看>>
DataTable带checkbox
查看>>
Oracle批量插入数据SQL语句太长出错:无效的主机/绑定变量名
查看>>
java 23种设计模式 深入理解
查看>>
datatables 参数详解(转)
查看>>
Spring:源码解读Spring IOC原理
查看>>
如何将git既添加GitHub的远程仓库,又添加码云的远程仓库
查看>>
Linux上安装python3
查看>>
Event StoryLine Corpus 论文阅读
查看>>
Causal Corpus 事件因果关系语料统计
查看>>
从 relu 的多种实现来看 torch.nn 与 torch.nn.functional 的区别与联系
查看>>
AtCoder Beginner Contest 132 F Small Products
查看>>
洛谷 P2147 [SDOI2008]洞穴勘测
查看>>
算法笔记--可撤销并查集 && 可持久化并查集
查看>>