二进制搜索模板,用于查找最靠近键的双精度词

时间:2016-12-29 23:43:04

标签: c++ templates binary-search

C ++中是否有模板,它允许在排序向量中找到最接近键的值,并返回其索引(迭代器)。我发现的,只返回一个布尔值。

编辑:问题的动机是二进制搜索返回一个布尔值。我得出结论,在返回布尔值时,迭代器也是已知的。返回它,我可以找到找到哪个元素。没有提供这种二进制搜索的原因是什么?。

1 个答案:

答案 0 :(得分:0)

我不知道你是否想要避免对你的容器/数组进行排序,所以我将发布最普遍的方法。答案是 - 不。如果你不想对容器进行排序,那么就没有现成的模板,但你可以简单地编写自己的函数,如下所示:

template<typename iterator_t, typename value_t, typename comparator_t>
iterator_t nearest_element(iterator_t begin, iterator_t end, value_t value, comparator_t comparator) {
    return std::min_element(begin, end, [value, &comparator](double lhs, double rhs) {
        return comparator(std::abs(lhs - value), std::abs(rhs - value));
    });
}

template<typename iterator_t, typename value_t>
iterator_t nearest_element(iterator_t begin, iterator_t end, value_t value) {
    return nearest_element(begin, end, value, std::less<value_t>());
}

这只是简单的数学,最近的元素是从搜索值中减去它的绝对值最小的元素。上面的代码仍然可以让你更改比较器(但隐藏减法/ std::fabs),这样它也可以用来找到最远的值。

用法(没有指定的比较器)很简单,就像任何其他标准函数一样:

std::vector<double> vec {2., 5., -4.};
auto it = nearest_element(vec.begin(), vec.end(), -10.);
std::cout << *it << std::endl;