例如,在升序数组`[1, 3, 5, 5, 7]`中查找值5,std::lower_bound会返回指向第一个5的迭代器索引2;若查找值4,会返回指向5的迭代器索引2,因为4应插入在3和5之间。
第二句:std::upper_bound返回第一个大于目标值的元素迭代器 与lower_bound不同,std::upper_bound的逻辑是“找第一个‘超过’目标值的位置”——即从序列起始位置开始,找到第一个满足`element > value`的元素。它关的是目标值的“上限”,论目标值是否存在,返回的迭代器始终指向比目标值大的第一个元素。同样以数组`[1, 3, 5, 5, 7]`为例:查找值5时,std::upper_bound返回指向7的迭代器索引4,因为这是第一个大于5的元素;若查找值6,返回的同样是指向7的迭代器索引4。
第三句:两者均序列已按升序排列,且依赖默认的less比较器 这两个函数的正确运行有一个前提:输入的序列必须是升序排列的默认情况下。它们内部通过比较器默认是`std::less`确定元素顺序,若序列序,返回结果将不可预测。实际使用时,若序列按降序排列,需显式传入`std::greater`作为比较器参数,此时lower_bound会返回第一个不大于目标值的元素,upper_bound返回第一个小于目标值的元素。例如,降序数组`[7, 5, 5, 3, 1]`中,使用`std::lower_bound(begin, end, 5, std::greater
通过这三句话,能清晰区分std::lower_bound与std::upper_bound的核心差异:前者找“>=”的起点,后者找“>”的起点,且两者均依赖有序序列。在实际开发中,配合使用这两个函数可轻松获取目标值的区间如`[lower, upper)`即为所有等于目标值的元素范围,实现高效的范围查询与统计。
