You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现C++ STL upper_bound的反向效果,返回目标值左侧更小元素

结论

你当前的实现是完全正确的,无需手动实现二分搜索,STL提供的标准接口已经可以满足需求。

原理解释

STL中upper_bound的通用逻辑是:在已按照comp规则升序排列的区间中,返回第一个满足comp(传入值, 迭代器指向元素) == true的迭代器。

你使用了反向迭代器rbegin()/rend(),相当于把原非递减数组反转成了非递增序列,同时传入greater<int>()作为比较规则,此时upper_bound会在反转后的序列中找到第一个满足「301 > 元素」的位置,对应原数组中就是小于301的最大元素,和你的预期完全匹配。

你补充的边界判断if (p != arr.rend())也是正确的:如果没有比目标值更小的元素,upper_bound会返回rend(),此时直接访问*p会出现未定义行为,提前判断可以规避风险。

更直观的替代实现

如果你不想用反向迭代器,也可以基于正向迭代器实现相同效果,逻辑更易读:

// 非递减数组中找小于value的最大元素
auto p = lower_bound(arr.begin(), arr.end(), value);
if (p != arr.begin()) {
    --p;
    cout << *p << endl; // 得到目标值
} else {
    cout << "没有更小的元素" << endl;
}

这个实现的逻辑是:lower_bound会返回第一个大于等于value的元素位置,只要这个位置不是数组开头,往前挪一位就是小于value的最大元素。

代码验证

以你给出的测试数组为例,两种实现的输出都是-550,完全符合预期。

内容的提问来源于stack exchange,提问作者Mayukh Sarkar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 22:36:04