zoukankan      html  css  js  c++  java
  • STL二分查找函数的应用

    应用二分查找的条件必须是数组有序!

    其中二分查找函数有三个binary_serch,upper_bound,lower_bound

    测试数组

    int n1[]={1,2,2,3,3,4,5};
      int n2[]={5,4,3,3,2,2,1};
    

    binary_serch

    没有什么好说的,这个很简单,接受三个参数first,last,key三个值。如果在数组中查询到的话,那么就返回1否则返回0

    代码

    if(binary_search(n1,n1+7,3))
      cout<<1<<"
    ";
      if(binary_search(n1,n1+7,8))
      cout<<2<<"
    ";
    

    输出的结果为1

    upper_bound和lower_bound

    upper_bound返回数组中第一个大于指定数的指针,lower_bound返回数组第一个小于等于指定数的指针,他们的基本用法都是first,last,key

    解析图片

    测试程序

    cout<<n1[upper_bound(n1,n1+7,3)-n1]<<"
    ";
      cout<<n1[lower_bound(n1,n1+7,3)-n1]<<"
    ";
    

    输出结果为4,3

    解锁cmp参数

    upper_bound和lower_bound都可以自定义排序用cmp函数

    ①默认a<b

    bool cmp(int a,int b)
    {
      return a<b;
    }
    

    这种情况及是最初的情况,并没有什么其他的变化

    ②降序数组a>b

    bool cmp(int a,int b)
    {
      return a>b;
    }
    

    这种情况是对于降序数列的的自定义,upper是小于的第一个位置的指针,lower是大于等于的第一个位置的指针

    测试程序

    cout<<n2[upper_bound(n2,n2+7,3,cmp)-n2]<<"
    ";
      cout<<n2[lower_bound(n2,n2+7,3,cmp)-n2]<<"
    ";
    

    测试结果为2 3

    如果加等号例如<-><=那么就是upper和lower的效果颠倒

    完整测试程序

    #include <bits/stdc++.h>
    using namespace std;
    bool cmp(int a,int b)
    {
      return a>b;
    }
    int main()
    {
      ios::sync_with_stdio(0);
      cin.tie(0);
      cout.tie(0);
      int n1[]={1,2,2,3,3,4,5};
      int n2[]={5,4,3,3,2,2,1};
      if(binary_search(n1,n1+7,3))
      cout<<1<<"
    ";
      if(binary_search(n1,n1+7,8))
      cout<<2<<"
    ";
      cout<<n1[upper_bound(n1,n1+7,3)-n1]<<"
    ";
      cout<<n1[lower_bound(n1,n1+7,3)-n1]<<"
    ";
      cout<<n2[upper_bound(n2,n2+7,3,cmp)-n2]<<"
    ";
      cout<<n2[lower_bound(n2,n2+7,3,cmp)-n2]<<"
    ";
    }
    
  • 相关阅读:
    Kmp 加深理解 之 poj 3461
    Kmp 模板 之 hdu 1711 Number Sequence
    最大连续子序列和(经典DP) 之 hdu 1231 最大连续子序列
    数学 之 hdu 4710 Balls Rearrangement
    01背包变形 之 hdu 2126 Buy the souvenirs
    逆序数 之 hdu 1394 Minimum Inversion Number
    根据进程文件id查看所有进程信息
    N皇后问题
    17. 电话号码的字母组合
    697. 数组的度
  • 原文地址:https://www.cnblogs.com/baccano-acmer/p/9960281.html
Copyright © 2011-2022 走看看