STL中的二分查找(binary_search)

       STL中对于有序序列(vector,list等)提供了相当相当强大的二分搜索Binary search算法。对于可以随机访问容器(如vector等),binary search负载度为对数级别(LogN),对于非随机访问容器(如list),则算法复杂度为线性。现在简要介绍一下几种常用的binary search算法:

Iterator lower_bound (Iterator first,Iterator last, const T& value)
Iterator lower_bound (Iterator first,Iterator last, const T& value, Compare comp)
//返回一个迭代器,指向键值>=value的第一个元素

Iterator upper_bound (Iterator first,Iterator last, const T& value)
Iterator upper_bound (Iterator first,Iterator last, const T& value, Compare comp)
//返回一个迭代器,指向键值>value的第一个元素(注意此处与上一个的区别).

pair equal_range(Iterator first, Iterator last, const T& value)
pair equal_range(Iterator first, Iterator last, const T& value, Compare comp)
//试图在已排序的[first,last)中寻找value,它返回一对迭代器i和j,其中i是在不破坏次序的前提下,value可插入的第一个位置(亦即lower_bound),j则是在不破坏次序的前提下,value可插入的最后一个位置(亦即upper_bound),因此,[i,j)内的每个元素都等同于value,而且[i,j)是[first,last)之中符合此一性质的最大子区间


bool binary_search (ForwardIterator first, ForwardIterator last, const T& value)
bool binary_search (ForwardIterator first, ForwardIterator last, const T& value, Compare comp)
// 查找是否在[first,last)中存在iterator i,满足 !(*i<value) && !(value<*i) or comp(*i,value)==false && comp(value,*i)==false
// 存在则返回true,否则返回false. 
:如果查找的是自定义类型,则需在定义类型的时候,重载'<'或者'>'运算符,使元素有序,或者在结构体外定义比较友元函数,在查找的时候,STL查找函数会自动调用比较函数,比较的时候只是根据定义的比较函数进行比较,如果比较函数中,只使用了结构体元素的一部分,则比较是也只是进行部分匹配,不会是结构体的完全匹配,如果要完全匹配只能是在比较函数中使用上结构体中的所有元素。

例:

#include <iostream>
#include <set>
#include <string>
#include <algorithm>


using namespace std;

typedef struct CInvNode{
       int docId;   //Doc Id
       int frequecey; //Text frequency within
       friend bool operator <(const CInvNode &key1,const CInvNode &key2)
       {
            if(key1.docId<key2.docId)return true;
            else if(key1.docId<key2.docId)return false;
            else return false;
       }
      CInvNode(){offset=NULL;}

}CInvNode;

void main()

{

      CInvNode tmp;

      set<CInvNode>invert_1;

       tmp.docId=30;
       tmp.frequecey=2;
       invert_1.insert(tmp);

       binary_search(invert.begin(),invert.end(),tmp);//此时会返回真值,如果将tmp.frequecey=5还是会返回真值,因为比较

                                                                                         //函数中没有使用到

}



  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C++ STL实现二分查找的函数有三个:lower_bound、upper_bound和binary_search。 lower_bound函数用来查找第一个不小于给定值的元素,如果存在多个相同的元素,则返回第一个出现的位置。 upper_bound函数用来查找第一个大于给定值的元素,如果存在多个相同的元素,则返回第一个大于给定值的位置。 binary_search函数用来判断给定值是否在有序容器出现,如果存在则返回true,否则返回false。 在给出的代码,使用了lower_bound函数来查找数组a是否存在与b相等的元素,如果存在,则将其赋值给ans变量。 需要注意的是,使用这些函数前需要先对容器进行排序,以保证二分查找的正确性。可以使用algorithm头文件的sort函数对容器进行排序。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [STL二分查找](https://blog.csdn.net/jfkidear/article/details/100171041)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [C++ STL二分查找](https://blog.csdn.net/shuaizhijun/article/details/88982556)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值