lower_bound 和 upper_bound 是 C++ STL 中用于查找有序区间的两个函数,主要用来处理二分查找。
lower_bound(nums.begin(), nums.end(), nums[i]):- 这个函数返回的是第一个大于或等于
nums[i]的元素的位置。 - 如果
nums[i]存在于数组中,返回值是该元素在数组中的第一个出现位置;如果不存在,则返回第一个大于nums[i]的元素的位置。
- 这个函数返回的是第一个大于或等于
upper_bound(nums.begin(), nums.end(), nums[i]):- 这个函数返回的是第一个严格大于
nums[i]的元素的位置。 - 如果
nums[i]在数组中有重复的值,返回值将指向第一个比nums[i]大的元素。
- 这个函数返回的是第一个严格大于
两者的差别
- 当
nums[i]在数组中存在且有重复时:lower_bound(...): 返回的是第一个等于nums[i]的位置。upper_bound(...): 返回的是下一个大于nums[i]的位置,即它会跳过所有与nums[i]相等的元素。
示例
假设有一个已排序的数组:
std::vector<int> nums = {1, 2, 2, 3, 4};
int i = 1; // nums[i] = 2
调用:
auto lb = lower_bound(nums.begin(), nums.end(), nums[i]); // 指向第二个 '2' auto ub = upper_bound(nums.begin(), nums.end(), nums[i]); // 指向 '3'使用
.begin()方法计算索引:int index_lb = lb - nums.begin(); // index_lb = 1 (第二个 '2' 的位置) int index_ub = ub - nums.begin(); // index_ub = 3 ('3' 的位置)
因此,可以看出两者之间的差别在于,前者包含了目标值,而后者则不包含。
内容由零声教学AI助手提供,问题来源于学员提问




