1. 程式人生 > 其它 >lower_bound()與upper_bound()的簡單總結

lower_bound()與upper_bound()的簡單總結

技術標籤:c++stl

lower_bound()和upper_bound()簡單總結

目錄

一、簡介

1.lower_bound()和upper_bound()都是c++ 標準庫中的函式。
2.二者都利用二分查詢的方法查詢已排序的陣列中的元素。
3.它們的返回值都是一個地址。

二、函式原型

lower_bound的原型有兩個
原型1:

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

原型2:

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

三、作用

lower_bound()用於在已排好序的陣列中找出大於等於目標元素的下標最小的元素的地址。
upper_bound()用於在已排好序的陣列中找出大於目標元素的下標最小的元素的地址。

四、函式的引用

這兩個函式都有三(四)個引數,第四個引數是被查詢函式的排序方式,如果不填就預設為從小到大排序。

第一個引數是被查詢陣列的首地址,第二個引數是末地址,第三個是要目標元素,第四個是被查陣列的排序方式。
被查陣列排序方式寫的時候返回值應為bool型別,設定兩個引數(與被查陣列內元素型別相同即可)。

五、引用示例

例1:(三引數)

    int a[8]={1,2,3,4,5,6,7,8};//排好序的陣列
    int *p1=lower_bound(a,a+8,6);//這裡的返回值是第一個大於等於6的數,也就是6
    int *p2=upper_bound(a,a+8,6);//這裡的返回值是第一個大於6的數,也就是7
    cout<<*p1<<" "
<<*p2<<endl;

例2:(四引數)

bool cmp(int a,int b);
int main()
{
    int a[8]={71,22,83,4,15,26,67,28};//已經按照個位數從小到大排好序的陣列
    int *p1=lower_bound(a,a+8,36,cmp);//第一個個位數大於等於“36的個位數”的數是26
    int *p2=upper_bound(a,a+8,36,cmp);//第一個個位數大於“36的個位數”的數是67
    cout<<*p1<<" "<<*p2<<endl;
    return 0;
}
bool cmp(int a,int b)
{
    return a%10<b%10;//按照個位數從小到大排序
}

總結

lower_bound()和upper_bound()都是利用二分查詢來查詢資料的,可達到log(n)的時間複雜度進而提高效率。

參考文獻:

從沒見過這麼詳細的lower_bound的講解
百度百科

新人寫部落格,歡迎指出不足指出,希望與大家共同進步。

厚臉皮求個點贊QAQ

如果你感覺我寫的不錯就請點個關注吧^ _ ^