您的位置:首页 > 其它

二分模板以及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上
期望值是否存在?findbinary_search countfind
期望值是否存在?如果有,第一个等于这个值的对象在哪里?find equal_range find find或lower_bound(参见下面)
第一个不在期望值之前的对象在哪里?find_iflower_boundlower_boundlower_bound
第一个在期望值之后的对象在哪里?find_ifupper_boundupper_boundupper_bound
有多少对象等于期望值?countequal_range,然后distancecountcount
等于期望值的所有对象在哪里?find(迭代)equal_rangeequal_rangeequal_range
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: