C++ upper_bound()函数运行结果疑问:为何返回7而非1?
upper_bound 返回结果异常原因说明
你遇到的问题本质是没有满足upper_bound的前置使用条件,核心原因如下:
upper_bound仅对按指定比较器有序的序列生效,默认使用less<T>()比较器,要求传入序列为升序排列。如果你的序列是降序排列,没有配套传入greater<T>()比较器的话,返回结果是未定义的,完全不符合预期。- 当序列中所有元素都小于等于你传入的查找目标时,
upper_bound会直接返回序列的尾后迭代器end(),如果你用返回迭代器减去序列首迭代器计算偏移量,得到的结果就等于序列的总长度,也就是你拿到的7。
验证示例
你可以参考下面的代码复现你的问题和正确用法:
#include <iostream> #include <algorithm> #include <vector> using namespace std; int main() { // 错误用法:降序数组用默认比较器 vector<int> arr = {7,6,5,4,3,2,1}; // 查找目标为7,默认比较器要求升序,序列不满足条件 auto err_it = upper_bound(arr.begin(), arr.end(), 7); cout << err_it - arr.begin() << endl; // 输出7,和你得到的结果一致 // 正确用法:降序数组配套传入greater<int>()比较器 auto correct_it = upper_bound(arr.begin(), arr.end(), 7, greater<int>()); cout << correct_it - arr.begin() << endl; // 输出1,也就是你预期的结果 return 0; }
内容的提问来源于stack exchange,提问作者karanforprogram1
相关产品推荐
相关产品推荐

