std::upper_bound是C++ STL中定义在头文件中的函数,用于在已排序区间中查找第一个严格大于给定值的元素迭代器,要求容器升序排列,否则行为未定义。
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 的位置。二者配合可快速统计某值出现次数。
lower_bound(v.begin(), v.end(), 4) → 指向索引 2(第一个 4)upper_bound(v.begin(), v.end(), 4) → 指向索引 5(第一个 5)std::distance(lower, upper) = 3别把 upper_bound 当成“找上界值”,它只管位置;也别假设它返回值本身——返回的是迭代器,解引用前务必检查有效性。