lower_bound和upper_bound

阅读量: 451 编辑

lower_bound 和 upper_bound 用于在有序序列(如数组或容器)中进行二分查找。

lower_bound 函数用于查找在有序序列中第一个大于或等于给定值的元素的位置。

upper_bound 函数用于查找在有序序列中第一个大于给定值的元素的位置。

template<class ForwardIterator, class T>
ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& val);

template<class ForwardIterator, class T>
ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last, const T& val);

这两个函数在查找失败时返回的是一个迭代器,该迭代器指向有序序列中第一个大于给定值的位置。如果查找成功,则返回的迭代器指向找到的元素。

// 爱码岛编程
#include <bits/stdc++.h>
using namespace std;

int main() {

    // 数组
	int n = 8;
	int arr[] = {1, 4, 5, 7, 8, 9, 11, 13};
	
	int* lb = lower_bound(arr, arr + n, 7); // 大于等于7的元素的位置
	cout << lb - arr << endl; // 3
	
	int* ub = upper_bound(arr, arr + n, 7); // 大于7的元素的位置
	cout << ub - arr << endl; // 4

    return 0;
}

最右

可以借助 upper_bound 函数查找在有序序列中小于给定值的元素最右位置

// { 1, 4, 5, 7, 8, 9, 11, 13 }
int findRight(int arr[], int n, int target) {    // target = 7
    int *ub = upper_bound(arr, arr + n, target); // 大于7的元素的位置(8的位置)
    if (ub == arr) {
        return -1;
    }
    --ub; // 小于等于的位置
    
    while (*ub == target) { // 去掉等于的,就是小于的
        --ub;
        if (ub < arr) {
            return -1;
        }
    }
    return ub - arr;
}
爱码岛编程公众号
试卷资料
爱码岛编程小程序
在线刷题
苏ICP备13052010号
©2023 南京匠成信息科技有限公司