未排序数组中c ++中lower_bound的行为

时间:2014-08-31 13:03:30

标签: c++ arrays lower-bound

我想问一下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;
}

它输出为&#39; 2&#39;。但是根据lower_bound的定义,它给第一个元素的迭代器提供了失败的&#39;&lt;&#39;与&#39; val&#39;。因此根据这个定义,答案不应该是&#39; 8&#39;因为&#34; 8不小于7&#34;。我知道它适用于排序数组,但我想知道是否有这个值背后的逻辑或它是垃圾。

感谢。

1 个答案:

答案 0 :(得分:2)

由于违反了提供排序数组的前提条件,因此行为未定义。您的代码演示了两次未定义的行为:首先,当您将无序数组传递给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(尽管这是对特定系统特定的未定义行为的利用,并且不能保证在其他系统上产生相同的结果)。