这里我使用std::lower_bound()
创建了二元搜索功能。如下。如果我传递std::pair
,这可以正常工作,但是我想在pair
的第一个值上执行二进制搜索。我想在Comp
的{{1}}参数中可以做到这一点但不完全确定如何。
,即我的矢量如下所示。
lower_bound()
我想比较第一个值,即std::vector<std::pair<int,double>> v;
。
int
答案 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; } );