lower_bound执行二进制搜索

时间:2015-05-20 14:12:26

标签: c++ binary-search

这里我使用std::lower_bound()创建了二元搜索功能。如下。如果我传递std::pair,这可以正常工作,但是我想在pair的第一个值上执行二进制搜索。我想在Comp的{​​{1}}参数中可以做到这一点但不完全确定如何。

,即我的矢量如下所示。

lower_bound()

我想比较第一个值,即std::vector<std::pair<int,double>> v;

int

3 个答案:

答案 0 :(得分:3)

您需要像在std::lower_bound中一样将比较类添加到您的函数中:

template<class ForwardIt, class T, class Compare>
ForwardIt binary_searcht(ForwardIt first, ForwardIt last, const T& value, Compare cmp)
{
    ForwardIt i = std::lower_bound(first, last, value, cmp);
    if (i != last && !cmp(value, *i))
        return i;
    else
        return last;

}

typedef std::pair<int,double> mypair;
std::vector<mypair> v;
auto f = binary_searcht( v.begin(), v.end(), value, 
    []( const mypair &p1, const mypair &p2 ) { return p1.first < p2.first; } );

答案 1 :(得分:2)

使用自定义比较功能comp并将其与std::lower_bound

一起使用
bool comp( std::pair<int , double> &x , std::pair<int , double> &y)
{
     return x.second < y.second;
}
std::lower_bound(v.begin(),v.end(),value, comp);

答案 2 :(得分:2)

std::lower_bound的第二个定义是:

template< class ForwardIt, class T, class Compare >
ForwardIt lower_bound( ForwardIt first, ForwardIt last, const T& value, Compare comp );

因此,您可以编写自己的比较对的功能并使用它。您的模板功能如下所示:

template<class ForwardIt, class T, class Compare>
ForwardIt binary_searcht(ForwardIt first, ForwardIt last, const T& value, Compare comp)
{
    ForwardIt i = std::lower_bound(first, last, value, comp);
    if (i != last && !(value < *i))
        return i;
    else
        return last;
}

并且,如果您想将它用于std::vector< std::pair<int,double> >的元素,您应该以这种方式调用它:

bool compare(std::pair<int, double> a, std::pair<int, double> b) {
    return a.first < b.first;
}
binary_searcht(v.begin(), v.end(), value, compare);

或者,使用lambda表达式的geeky -std=c++11方式,如果你想拥有一个干净的代码并且不想声明其他函数:

typedef std::pair<int, double> tuple2;
auto result = binary_searcht(v.begin(), v.end(), 
    [](tuple2 &a, tuple2 &b) { return a.first < b.first; } );