网上看了一篇高评论的文章,动手操作下来发现完全错的,感觉还是好多人看各种资料看的迷糊
这篇文章就大道至简,总结用法,不纠结实现代码。
看这几条,很容易掌握规律???
lower_bound(iter 1,iter 2,val)寻找第一个大于等于val的迭代器
upper_bound(iter 1,iter 2,val)寻找第一个大于val的迭代器
原函数模型都是寻找大于,区别在于是否有等于号,lower大于等于,upper只大于,所以只能用于从小到大的排序
bool cmp ( const int &val , const int &e ) 类型是迭代器指向 和 val(两者应一致,val和e位置不可替换,val是比较值,e是迭代器指向值)
lower_bound(iter 1,iter 2,val,cmp)寻找第一个不满足cmp的迭代器,只适用前面都满足cmp的排序,错误的例子:【1,2,3,4,5】, cmp偶数为true,最后返回3,而不是1
upper_bound(iter 1,iter 2,val,cmp)寻找第一个满足cmp的迭代器,只适用前面都不满足cmp的排序,正确的例子:【1,3,4】,cmp偶数为true,最后返回4
加入自定义cmp,lower找“第一个”不满足cmp的数,upper找“第一个”满足cmp的数。“第一个”指只适用前面都与目标数cmp条件互斥(而不是找位置上的第一个)
lower_bound(iter 1,iter 2,val,greater<T>() )寻找第一个小于等于val的迭代器
lower_bound(iter 1,iter 2,val,less<T>() )寻找第一个大于等于val的迭代器。
lower改成upper只是少了等于的条件,其它一样。可以看出,greater只适用降序,less只适用升序。不然只会返回第一个值。
总结:
首先,两个函数必须要求已排序的内容,因为里面是二分搜索。
其次,所有查不到都返回end()。
最后,不要背,不要记,不要想——>没有规律。用的时候现查!