STL 二分法 upper_bound()與lower_bound()使用方法

   lower_bound( first, last,val)算法返回一個非遞減序列[first, last)中的第一個大於等於值val的位置

的迭代器

       upper_bound(first, last, val)算法返回一個非遞減序列[first, last)中第一個大於val的位置的迭代器。

    使用頭文件

     #include<iostream>

     using namespace std;

測試樣例

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int a[]={0,1,2,4,5,6,7,8,9,10};
    //返回對應元素
    cout<<*upper_bound(a,a+10,3)<<endl;   //4 第一個大於


    cout<<*lower_bound(a,a+10,3)<<endl;   //4 第一個大於等於


    //返回對應下標
    cout<<upper_bound(a,a+10,4)-a<<endl;   //4 第一個大於


    cout<<lower_bound(a,a+10,4)-a<<endl;   //3 第一個大於等於


    cout<<upper_bound(a,a+10,-1)-a<<endl;   //0 未找到將返回第一個


    cout<<lower_bound(a,a+10,-1)-a<<endl;   //0 未找到將返回第一個


    cout<<upper_bound(a,a+10,11)-a<<endl;   //10 未找到將返回最後


    cout<<lower_bound(a,a+10,11)-a<<endl;   //10 未找到將返回最後
    /*
    注意:
    兩個函數使用時,必須確定序列爲非遞減序列,否則會發生錯誤
    */
    return 0;
}

      這兩個函數還分別有一個重載函數,可以接受第四個參數。如果第四個參數傳入greater<Type>(),其中Type改成對應類型,可以用於查找非遞增序列

測試樣例

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int a[]={10,9,8,7,6,5,4,2,1,0};

    cout<<upper_bound(a,a+10,4,greater<int>())-a<<endl;   //7 返回第一個小於

    cout<<lower_bound(a,a+10,4,greater<int>())-a<<endl;   //6 返回第一個小於等於

    cout<<upper_bound(a,a+10,-1,greater<int>())-a<<endl;   //10 未找到將返回最後

    cout<<lower_bound(a,a+10,-1,greater<int>())-a<<endl;   //10 未找到將返回最後

    cout<<upper_bound(a,a+10,11,greater<int>())-a<<endl;   //0 未找到將返回第一個位置

    cout<<lower_bound(a,a+10,11,greater<int>())-a<<endl;   //0 未找到將返回第一個位置

    return 0;
}

   兩個函數配合使用可以進行查找 有序序列中的元素個數

使用樣例

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int a[]={0,1,2,3,5,5,5,6,7};
   //查找元素 5 的個數
    cout<<upper_bound(a,a+10,5)-lower_bound(a,a+10,5)<<endl;

    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章