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
的值之前,即违反了先决条件。您的程序有未定义的行为,并且确切的结果值是不可预测的和不相关的。