欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于STL中二分查找算法的使用

程序员文章站 2024-03-17 18:59:16
...

lower_bound: 有序集合中,通过二分查找,找到第一个大于等于目标值的位置。

upper_bound: 有序集合中,通过二分查找,找到第一个大于目标值的位置。

binary_search: 有序集合中,通过二分查找,寻找目标值。

STL的有序容器set,自带了lower_bound和upper_bound的接口,可以方便的调用。

以下是对二分查找接口的使用示例:

#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;

int main() {
    vector<int> arr{ 1,2,3,5,6,7,8,9 };
    for (auto& i : arr) {
        cout << i << " ";
    }
    cout << endl;

    // lower_bound: 有序集合里,通过二分查找,快速找到大于等于目标值的位置
    auto pos = lower_bound(arr.begin(), arr.end(), 4);
    if (pos != arr.end()) {
        cout << "lower_bound found 4: " << *pos << endl;
    }

    // lower_bound: 有序集合里,通过二分查找,快速找到大于等于目标值的位置
    auto pos2 = lower_bound(arr.begin(), arr.end(), 5);
    if (pos2 != arr.end()) {
        cout << "lower_bound found 5: " << *pos2 << endl;
    }

    // upper_bound: 有序集合里,通过二分查找,快速找到大于目标值的位置
    auto pos3 = upper_bound(arr.begin(), arr.end(), 6);
    if (pos3 != arr.end()) {
        cout << "upper_bound found 6: " << *pos3 << endl;
    }

    // binary_search: 有序集合中,通过二分查找,寻找目标值
    auto pos4 =  binary_search(arr.begin(), arr.end(), 7);
    if (pos4 == true) {
        cout << "binary_search found 7: true"  << endl;
    }

    // 有序集合set, 自带lower_bound, upper_bound接口
    set<int> s{ 1,23,4,32,43,5,4,65 };
    auto pos5 = s.lower_bound(23);
    if (pos5 != s.end()) {
        cout << "set lower_bound found 23: " << *pos5 << endl;
    }

    auto pos6 = s.upper_bound(23);
    if (pos6 != s.end()) {
        cout << "set lower_bound found 23: " << *pos6 << endl;
    }
    return 0; ;
}

以下是代码输出:

1 2 3 5 6 7 8 9
lower_bound found 4: 5
lower_bound found 5: 5
upper_bound found 6: 7
binary_search found 7: true
set lower_bound found 23: 23
set lower_bound found 23: 32

谢谢阅读