std::upper_bound是C++ STL中定义在头文件中的函数,用于在已排序区间中查找第一个严格大于给定值的元素迭代器,要求容器升序排列,否则行为未定义。

upper_bound 函数名写错了,标准库是 upper_bound,没有下划线和后缀
标准 C++ STL 中只有 std::upper_bound,不存在 upper_bound_c++ 或带下划线的变体。这个名称可能是拼写错误或混淆了其他语言/库的命名习惯。它属于 头文件,作用是在**已排序区间**中查找第一个 **严格大于** 给定值的元素位置。
必须保证容器已升序排列,否则结果未定义
upper_bound 的行为依赖于数据有序性。若数组或 vector 未排序,返回的迭代器可能指向任意位置,甚至越界,且不报错——这是最常踩的坑。
- 升序排列是硬性前提,不能靠“大概排过”蒙混
- 降序排列时不能直接用,默认比较逻辑是
operator,需显式传入std::greater() - 对
std::set/std::map等关联容器可直接使用,因其内部自动维持有序
正确调用方式:注意参数顺序与返回值含义
upper_bound 返回的是迭代器(不是下标),指向第一个 > value 的元素;若全部 ≤ value,则返回末尾迭代器(如 v.end())。常用场景是配合 std::distance 求下标,或直接解引用取值(需先判断是否越界)。
#include#include #include int main() { std::vector
v = {1, 2, 4, 4, 4, 5, 7}; auto it = std::upper_bound(v.begin(), v.end(), 4); // 查找第一个 > 4 的元素 if (it != v.end()) { std::cout << "第一个大于 4 的值是: " << *it << "\n"; // 输出 5 std::cout << "其下标是: " << std::distance(v.begin(), it) << "\n"; // 输出 5 } }
与 lower_bound 的关键区别:等于也算在“下界”里
面对重复元素(如多个 4),lower_bound 返回第一个 ≥ value 的位置,upper_bound 返回第一个 > value 的位置。二者配合可快速统计某值出现次数。
立即学习“C++免费学习笔记(深入)”;
-
lower_bound(v.begin(), v.end(), 4)→ 指向索引 2(第一个 4) -
upper_bound(v.begin(), v.end(), 4)→ 指向索引 5(第一个 5) - 所以 4 的个数 =
std::distance(lower, upper)= 3
别把 upper_bound 当成“找上界值”,它只管位置;也别假设它返回值本身——返回的是迭代器,解引用前务必检查有效性。










