二分模板以及STL中的查找
2013-05-13 15:38
459 查看
二分查找的基本实现
int b_search(int key,int a[],int n) { int l=0,r=n-1; while (l<=r) { int m=(l+r)/2; if (a[m]==key) return m; if (a[m]<key) l=m+1; else r=m-1; } return -1; }
STL中的二分查找
int k=lower_bound(a,a+n,key)-a;
int k=upper_bound(a,a+n,key)-a;
lower_bound()返回数组中>=key的第一个元素的位置
upper_bound()返回数组中>key的第一个元素的位置
-------------------
ForwardIterator lower_bound (ForwardIterator first,ForwardIterator last, const T& value)
ForwardIterator lower_bound (ForwardIterator first,ForwardIterator last, const T& value, Compare comp)
//查找最远的一个iterator i, 使得[first,i)里面的任意一个iterator j,有 *j < value or comp(*j,value)==true.
ForwardIterator upper_bound (ForwardIterator first,ForwardIterator last, const T& value)
ForwardIterator upper_bound (ForwardIterator first,ForwardIterator last, const T& value, Compare comp)
//查找最远的一个iterator i, 使得[first,i)里面的任意一个iterator j,有 !(*j < value) or comp(*j,value)==false.
pair equal_range(ForwardIterator first, ForwardIterator last, const T& value)
pair equal_range(ForwardIterator first, ForwardIterator last, const T& value, Compare comp)
//查找最大的subrange[i,j),使得任意一个iterator in [i,j)满足!(*k<value) && !(value<*k) or comp(*k,value)==false && comp(value,*k)==false.
vector<Widget> vw; ... sort(vw.begin(), vw.end()); typedef vector<Widget>::iterator VWIter; // 方便的typedef typedef pair<VWIter, VWIter> VWIterPair; VWIterPair p = equal_range(vw.begin(), vw.end(), w); if (p.first != p.second) { // 如果equal_range不返回 // 空的区间... ... // 说明找到了,p.first指向 // 第一个而p.second // 指向最后一个的下一个 } else { ... // 没找到,p.first和 // p.second都指向搜索值 } // 的插入位置
bool binary_search (ForwardIterator first, ForwardIterator last, const T& value)
bool binary_search (ForwardIterator first, ForwardIterator last, const T& value, Compare comp)
// 查找是否在[first,last)中存在iterator i,满足 !(*i<value) && !(value<*i) or comp(*i,value)==false && comp(value,*i)==false
// 存在则返回true,否则返回false.
STL中的其他查找
count:计算对象区间中的数目。find:返回第一个对象的位置。
list<Widget> lw; // Widget的list Widget w; // 特定的Widget值 ... if (count(lw.begin(), lw.end(), w)) { ... // w在lw中 } else { ... // 不在 }
if (find(lw.begin(), lw.end(), w) != lw.end()) { ... // 找到了 } else { ... // 没找到 }
适用情况
你想知道的 | 在无序区间 | 在有序区间 | 在set或map上 | 在multiset或multimap上 |
期望值是否存在? | find | binary_search | count | find |
期望值是否存在?如果有,第一个等于这个值的对象在哪里? | find | equal_range | find | find或lower_bound(参见下面) |
第一个不在期望值之前的对象在哪里? | find_if | lower_bound | lower_bound | lower_bound |
第一个在期望值之后的对象在哪里? | find_if | upper_bound | upper_bound | upper_bound |
有多少对象等于期望值? | count | equal_range,然后distance | count | count |
等于期望值的所有对象在哪里? | find(迭代) | equal_range | equal_range | equal_range |
相关文章推荐
- 二分模板以及STL中的查找
- 数据结构实验之查找四:二分查找模板+STL
- 快速排序以及二分查找的实现
- 二分查找需要注意的问题,以及在数据库内核中的实现
- STL中的二分查找——lower_bound 、upper_bound 、binary_search
- 二分查找模板
- 032day(STL中的二分查找算法)
- STL中的二分查找(binary_search)
- 语法:STL中的有关二分查找的算法
- 二分查找之美:二分查找及其变体的正确性以及构造方式
- 彻底轻松搞定顺序存储结构元素的二分查找的时间复杂度优势以及如何算时间复杂度
- 有关STL的二分查找函数的理解
- C++数据结构与STL--二分查找
- 【模板】二分查找
- STL中与二分查找相关的4个函数(转)
- pearl(二分查找,stl)
- 判断一个数组是否已经排好序以及二分查找
- 快速排序以及二分查找的实现
- 符号表以及在有序数组中的二分查找
- 如何写出正确的二分查找?——利用循环不变式理解二分查找及其变体的正确性以及构造方式