cpp 中未排序数组上的 lower_bound 的行为

2023-11-26

我想问 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”失败“

Thanks.


由于违反了提供排序数组的前提条件,因此行为未定义。您的代码两次演示了未定义的行为:首先,当您将无序数组传递给lower_bound,第二,当您取消引用时iter而不将其与arr+6 first.

不过,很容易看出发生了什么:背后的算法lower_bound是基本的二分查找。你给算法一个数组,它把它们分成两半,并检查中间的项目。您提供了偶数个项目,有两个数字可以被视为“位于中间” - 10 和 1。看起来算法选择了1,将其与您的搜索项 7 进行比较,并继续在数组的上半部分中搜索,检查 2 和 3,最后返回指向数组末尾的指针.

当您取消引用该指针时,您会得到垃圾;不幸的是,它恰好与数组的元素之一匹配,即 2,导致您得出错误的结论。

按如下方式更改代码以查看实际返回的内容:

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

现在取消引用索引 6 处的元素是有效的;你的代码可能应该打印-1(尽管这是对特定于您的特定系统的未定义行为的利用,并且不能保证在其他系统上产生相同的结果)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cpp 中未排序数组上的 lower_bound 的行为 的相关文章

随机推荐