代码之家  ›  专栏  ›  技术社区  ›  dicroce

STL“最近”方法?

  •  4
  • dicroce  · 技术社区  · 15 年前

    我正在寻找一个STL排序,如果容器中没有确切的值,它将返回“最接近”目标值的元素。它需要快速,所以本质上我正在寻找一个稍微修改的二进制搜索。。。我可以写,但它似乎已经存在了。。。

    4 回复  |  直到 15 年前
        1
  •  9
  •   Niki    15 年前

    你是说 lower_bound / upper_bound

    澄清:上下限的全局版本只有在对范围进行排序时才起作用,因为它们在内部使用某种二进制搜索。(显然,std::map中的上/下界方法总是有效的)。你在问题中说你在寻找某种二进制搜索,所以我假设范围是排序的。

    而且,也不是 也不是 上限 X 您要查找的不是范围的成员,它们都将返回大于 将返回等于 , 上限 将返回最后一个值等于 .

    • 下限
    • . 最后(即最高)元素是最近的元素
    • . 第一个(即最低的)元素是最接近的元素
    • 如果它返回一个位于范围中间的元素,请检查该元素和之前的元素-更接近于
        2
  •  6
  •   Philip Potter    15 年前

    所以你要找的元素与某个值的距离最小 k

    使用 std::transform 转换每个 x x-k . 使用 std::min_element abs(l) < abs(r) . 然后添加 回到结果上来。

    标准:最小元素 带比较函数 abs(l-k) < abs(r-k) std::转换 .

    编辑2:这对未分类的容器很好。对于分类的容器,你可能需要尼基的答案。

        3
  •  3
  •   Mark B    15 年前

    std::upper_bound 直接在前面找出哪个最接近:

    // Untested.
    template <class Iter, class T>
    Iter closest_value(Iter begin, Iter end, T value)
    {
        Iter result = std::upper_bound(begin, end, value);
        if(result != begin)
        {
            Iter lower_result = result;
            --lower_result;
            if(result == end || ((value - *lower_result) < (*result - value)))
            {
                result = lower_result;
            }
        }
    
        return result;
    }
    

    如果容器未分类,请使用 min_element 用一个已经提出的谓词。

        4
  •  2
  •   Fred Larson    15 年前

    std::min_element 用比较函子计算你的距离。