STL中二分查找函数

1. binary_search

binary_search函数用于判断一个元素是否存在于已排序的范围内。其原型如下:

bool binary_search( ForwardIt first, ForwardIt last, const T& value );


其中,firstlast是范围的首尾迭代器,value是要查找的元素。如果找到value,则返回true;否则返回false。这个函数只告诉你元素是否存在,但不返回元素的位置。

2. lower_bound

lower_bound函数用于查找第一个不小于给定值的元素。其原型如下:

ForwardIt lower_bound( ForwardIt first, ForwardIt last, const T& value );


如果范围内存在value,则返回指向第一个value的迭代器;如果不存在,则返回指向第一个大于value的元素的迭代器(如果所有元素都小于value,则返回last)。这个函数返回的迭代器可以用来获取元素的位置(通过减去范围的起始迭代器)。

此外,由于 lower_bound 依赖于序列的排序,因此在使用之前,必须确保序列是已排序的。如果序列未排序,则 lower_bound 的结果将是未定义的。

最后,由于 lower_bound 返回的是一个迭代器,因此你可以通过减去 a.begin() 来计算找到的元素在序列中的位置(索引),但请注意,如果 lower_bound 返回的是 a.end(),则这种计算可能会导致未定义的行为(因为它实际上是在计算一个越界的索引)。在大多数情况下,你应该检查返回值是否等于 a.end(),以确定是否找到了元素。

3. upper_bound

upper_bound函数用于查找第一个大于给定值的元素。其原型与lower_bound相同。

ForwardIt upper_bound( ForwardIt first, ForwardIt last, const T& value );
如果范围内存在value,则返回指向第一个大于value的元素的迭代器;如果不存在,则返回的结果与lower_bound在不存在value时相同。这个函数同样可以用来获取元素的位置(通过减去范围的起始迭代器),但它是查找大于给定值的第一个元素。

示例代码

以下是使用这些STL函数的示例代码:

#include <iostream>  
#include <vector>  
#include <algorithm> // 包含binary_search, lower_bound, upper_bound  
  
int main() {  
    std::vector<int> nums = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};  
    int target = 7;  
  
    // 使用binary_search  
    if (std::binary_search(nums.begin(), nums.end(), target)) {  
        std::cout << "元素 " << target << " 存在于数组中" << std::endl;  
    } else {  
        std::cout << "元素 " << target << " 不存在于数组中" << std::endl;  
    }  
  
    // 使用lower_bound  
    auto it = std::lower_bound(nums.begin(), nums.end(), target);  
    if (it != nums.end() && *it == target) {  
        std::cout << "元素 " << target << " 的位置是 " << std::distance(nums.begin(), it) << std::endl;  
    } else if (it != nums.end()) {  
        std::cout << "第一个不小于 " << target << " 的元素是 " << *it << ",位置是 " << std::distance(nums.begin(), it) << std::endl;  
    } else {  
        std::cout << "所有元素都小于 " << target << std::endl;  
    }  
  
    // 使用upper_bound  
    it = std::upper_bound(nums.begin(), nums.end(), target);  
    std::cout << "第一个大于 " << target << " 的元素是 " << (it != nums.end() ? *it : "无") << std::endl;  
  
    return 0;  
}


这些STL函数大大简化了二分查找的实现,并且由于它们是库函数,通常经过了优化,因此在性能上也是很好的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值