【发布时间】:2020-06-06 11:26:01
【问题描述】:
假设我有一个vector,它的元素是int 类型。如何优雅地使用std::lower_bound() 来寻找最接近目标值的元素?
我写的代码如下图:
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vec {3,4,5,10};
int target = 6;
auto found {
lower_bound(
vec.begin(),
vec.end(),
target,
[=] (int ele1, int ele2) {
return (abs(ele1 - target) > abs(ele2 - target));
}
)
};
cout << (found-vec.begin()) << endl;
return 0;
}
它返回4的索引,这意味着found = vec.end()。相反,我想获得2 的索引。我哪里搞砸了?
【问题讨论】:
-
lower_bound要求被搜索容器的内容根据比较函数排序,在这种情况下不正确,因为这样显示的代码是未定义的行为。 -
如果
vec是有序且大的,使用区间二分法、牛顿法或(我最喜欢在收敛性和保证方面)Ridder 法可能有用。 -
为什么要使用
lower_bound?它似乎不是这项工作的好工具。
标签: c++ binary-search lower-bound