STL"最接近"的方法?

dic*_*oce 4 c++ binary search

我正在寻找一个STL排序,如果容器中不存在确切的值,则返回与目标值"最接近"的元素.它需要很快,所以基本上我正在寻找一个略微修改的二进制搜索...我可以写它,但它似乎应该已经存在的东西......

Nik*_*iki 9

你的意思是lower_bound/ upper_bound功能?这些执行二进制搜索并返回最接近您正在寻找的值的元素.

澄清:lower/upper_bound的全局版本仅在范围排序时才起作用,因为它们在内部使用某种二进制搜索.(显然,std :: map中的lower/upper_bound方法始终有效).你在你的问题中说你正在寻找某种二进制搜索,所以我假设范围是有序的.

此外,两者lower_bound都不upper_bound返回最近的成员.如果X您要查找的值不是范围的成员,则它们将返回大于第一个元素X.否则,lower_bound将返回第一个值等于X,upper_bound将返回最后一个值等于X.

所以要找到最接近的值,你必须这样做

  • 呼叫 lower_bound
  • 如果它返回范围的结尾,则所有值都小于X.最后一个(即最高的)元素是最接近的元素
  • 如果返回范围的开头,则所有值都大于X.第一个(即最低的)元素是最接近的元素
  • 如果它返回范围中间的元素,请检查该元素和元素之前 - 更接近的元素X是您要查找的元素

  • @Space_Cowboy:我还是不明白.如果我的最后一个元素低于我正在寻找的值,那么之后的下一个元素应该是第一个更大的元素.比较距离并使用较近的距离.无需调用这两个函数. (3认同)

Phi*_*ter 6

那么你正在寻找一个距离某个值最小的元素k

使用std::transform每个变换xx-k.使用std::min_element带有返回的比较函数abs(l) < abs(r).然后添加k回结果.

编辑:或者,您可以使用std::min_element比较功能abs(l-k) < abs(r-k),并消除std::transform.

EDIT2:这适用于未分类的容器.对于已分类的容器,您可能需要nikie的答案.