C++ STL 二分查找函数(lower_bound 和 upper_bound)

今天写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;
}

猜你喜欢

转载自blog.csdn.net/Binary_Heap/article/details/79328660