C++ STL 使用比较谓词/函子与容器

c++ stl using compare predicate/functor with containers

本文关键字:谓词 STL 比较 C++      更新时间:2023-10-16

我已经有几年没有碰过C++了,所以请耐心等待。我需要在其他容器的排序向量中进行二进制搜索,比如说成对,但无论出于何种原因,我都无法编译几行。

因此,对于初学者来说,这编译得很好:

bool cmp_pair( int l, int r )
{
    return l < r;
}
main ()
{
    vector<int> v;
    binary_search( v.begin(), v.end(), 0, cmp_pair );
  return 0;
}

但这不会:

bool cmp_pair( const pair<int,int>& l, const pair<int,int>& r )
{
    return l.first < r.first;
}
main ()
{
    vector< pair< int, int > > v;
    binary_search( v.begin(), v.end(), 0, cmp_pair );
  return 0;
}

函子也无济于事:

struct cmp_pair {
    bool operator()( const pair<int,int>& l, const pair<int,int>& r )
    {
        return l.first < r.first;
    }
};
main ()
{
    vector< pair< int, int > > v;
    binary_search( v.begin(), v.end(), 0, cmp_pair() );
  return 0;
}

由于您正在对对向量进行二叉搜索,因此第三个参数应该是对的,因此您的代码应如下所示:

using namespace std;
bool cmp_pair( const pair<int,int>& l, const pair<int,int>& r )
{
    return l.first < r.first;
}
int main ()
{
    vector< pair< int, int > > v;
   if(binary_search( v.begin(), v.end(), std::make_pair(0,0), cmp_pair ))
   {
     std::cout<<"found...."<<std::endl;
   }
   else
   {
    std::cout<<"not found...."<<std::endl;
   }
  return 0;
}

比较器中也存在同样的问题