今天写O(n logn)的LIS,发现自己写Search太麻烦。一直不会STL的二分查找,于是去学..
(一) lower_bound
如果有这个值,返回第一次出现这个值的迭代器(减去begin就是下标)
如果没有,返回第一个比它大的值的位置
记为:最早可以插入的位置
(二) upper_bound
返回第一个比它大的值的位置
记为:最晚可以插入的位置
(三) binary_search
这个返回值是bool,表示有没有这个元素
下面是个演示(加上了不必要的cmp函数演示一下)
#include <iostream>
#include <algorithm>
using namespace std;
bool cmp(int a, int b) {
return a < b;
}
int main() {
cout << "lower_bound : {1, 2, 3, 3, 3, 5, 5, 8, 9, 9}\n";
int a[10] = {1, 2, 3, 3, 3, 5, 5, 8, 9, 9};
cout << "pos(value = 3) : " << lower_bound(a, a+10, 3, cmp) - a << endl; //输出2
cout << "pos(value = 4) : " << lower_bound(a, a+10, 4, cmp) - a << endl; //输出5
cout << "\n";
cout << "upper_bound : {1, 2, 3, 3, 3, 5, 5, 8, 9, 9}\n";
int b[10] = {1, 2, 3, 3, 3, 5, 5, 8, 9, 9};
cout << "pos(value = 3) : " << upper_bound(a, a+10, 3, cmp) - a << endl; //输出2
cout << "pos(value = 4) : " << upper_bound(a, a+10, 4, cmp) - a << endl; //输出5
return 0;
}