lower_bound和upper_bound c++
时间: 2025-06-03 11:44:01 浏览: 32
### C++ 中 `lower_bound` 和 `upper_bound` 函数的使用方法与区别
#### 定义和头文件引入
`lower_bound` 和 `upper_bound` 是 C++ 标准模板库(STL)中用于在有序范围内执行二分查找操作的两个常用算法。为了使用这些函数,程序需要包含 `<algorithm>` 头文件[^1]。
#### 功能描述
- **`lower_bound`**: 查找第一个不小于给定值的位置。如果找到这样的元素,则返回指向该位置的迭代器;如果没有找到任何满足条件的元素,则返回超出范围的一个迭代器。
- **`upper_bound`**: 寻找严格大于指定目标的第一个位置,并同样以迭代器形式返回结果。这意味着对于重复项而言,它会定位到紧接最后一个等于键值之后的那个条目处。
#### 参数说明
这两个函数接受四个参数:
1. 输入序列起始地址或迭代器 (`first`)
2. 输入序列结束地址或迭代器 (`last`) —— 注意这是指向末尾下一个位置的指针
3. 要查找的目标数值 (`value`)
4. 可选比较谓词,默认情况下采用升序排列方式来决定顺序关系
当应用于关联容器如 set 或 multiset 时, 这些函数可以直接接收容器名作为前两个参数而无需显式提供边界迭代器[^2]。
#### 返回值解释
两者都返回一个随机访问迭代器或者输入迭代器类型的对象,具体取决于所处理的数据结构种类。当调用成功并确实存在符合条件的结果时,这个迭代器将指向相应的元素;反之则可能指向容器末端(`end()`), 表明未发现匹配项。
#### 示例代码展示如何运用上述特性:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
int main(){
std::vector<int> vec = {1, 2, 2, 3, 4};
auto lb_it = std::lower_bound(vec.begin(), vec.end(), 2);
auto ub_it = std::upper_bound(vec.begin(), vec.end(), 2);
if (lb_it != vec.end()) {
std::cout << "Lower bound of 2 is at position: "
<< std::distance(vec.begin(), lb_it)
<< ", value=" << *lb_it << '\n';
}
if (ub_it != vec.end()) {
std::cout << "Upper bound of 2 is at position: "
<< std::distance(vec.begin(), ub_it)
<< ", value=" << *ub_it << '\n';
}
return 0;
}
```
此段代码展示了在一个整数向量上应用 `lower_bound` 和 `upper_bound` 的效果,其中包含了多个相同的关键字实例以便更清晰地理解两者的差异所在。
阅读全文
相关推荐


















