upper_bound错误行为


vector<int> v = {0,1,3,2};
auto x = upper_bound(v.rbegin(), v.rend(), 1);
cout<<(*x);

这段代码给出了输出24576

vector<int> v = {0,1,3,2,2};
auto x = upper_bound(v.rbegin(), v.rend(), 1);
cout<<(*x);

输出2。

为什么?

std::upper_bound有一个前提条件。这里引用cppreference,而不是标准:

范围[first, last)必须根据表达式!(value < element)!comp(value, element)进行划分,即表达式为true的所有元素必须位于表达式为false的所有元素之前。

这取决于你,调用者,确保满足这个前提条件,如果你没有这样做,你的程序将有未定义的行为。

由于传递了反向迭代器,因此第一个示例的算法序列为2, 3, 1, 0。(第二个也有同样的问题。)表达式!(1 < element)对该序列求值为false, false, true, true,这意味着true的值不在false的值之前,即违反了先决条件。您的程序有未定义的行为,并且确切的结果值是不可预测的和不相关的。

相关内容

  • 没有找到相关文章

最新更新