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

标签 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;
}

它给出的输出为“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(尽管这是对您的特定系统特定的未定义行为的利用,并且不能保证在其他系统上产生相同的结果)。

关于c++ - 未排序数组上 cpp 中 lower_bound 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25592266/

相关文章:

c++ - VS 2003 在后期构建期间无法注册 regsvr32。命令提示符没有问题

c++ - 是否有像 boosts bcp for Eigen 这样的工具?

c - 将 for 循环中的字符串保存到 c 中的数组

JavaScript 嵌入每天都会变化的视频

java - Java 库是否具有 C++ 中的 std::lower_bound() 、 std::upper_bound() 之类的函数?

c++ - 你缓存 LoadLibrary HINSTANCE 吗?

c++ - 如何在不覆盖其他数据的情况下编辑文件中的数据?

c - 打印垃圾值,c

algorithm - 验证 NP-hard 优化问题的解决方案的复杂性?

c++ - 如何使用 C++ STL 删除集合中从开始到迭代器之前的一个元素的元素?