簡體   English   中英

cpp 中lower_bound 在未排序數組上的行為

[英]Behavior of lower_bound in cpp on unsorted array

我想問一下當 cpp ( C++ ) 中的 lower_bound 應用於未排序的數組時,它的行為如何。 我的意思是當我運行以下程序時。

#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
    int arr[]={8,9,10,1,2,3};
    auto itr= lower_bound(arr,arr+6,7);
    cout<<*itr<<endl;
}

它給出的輸出為'2'。 但是根據lower_bound的定義,它將迭代器提供給第一個以“val”失敗的“<”元素。 所以根據這個定義,答案不應該是'8',因為“8不小於7”。 我知道它適用於排序數組,但我想知道這個值背后是否有邏輯或者它是垃圾。

謝謝。

由於違反了提供排序數組的前提條件,因此行為未定義。 您的代碼演示了兩次未定義的行為:首先,當您將無序數組傳遞給lower_bound ,其次,當您取消引用iter而不先將其與arr+6進行比較時。

不過,很容易看出發生了什么: lower_bound背后的算法是一個基本的二分搜索。 你給算法一個數組,它把它們分成兩半,然后檢查中間的項目。 您提供了偶數個項目,有兩個數字可以被視為“處於中間” - 10 和 1。看起來算法選擇了1 ,將其與您的搜索項目 7 進行比較,並在上半部分繼續搜索的數組,檢查 2 和 3,最后返回指向數組末尾的指針

當你取消引用那個指針時,你會得到垃圾; 不幸的是,它恰好與數組的元素之一匹配,即 2,導致您得出錯誤的結論。

如下更改您的代碼以查看實際返回的內容:

int arr[]={8,9,10,1,2,3, -1};

現在取消引用索引 6 處的元素是有效的; 您的代碼可能應該打印-1 (盡管這是對特定系統特定的未定義行為的利用,並且不能保證在其他系統上產生相同的結果)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM