0

binary_search について読んでいて、述語を使用して実装しようとしました。これが私のコードです(使用しているソート述語も含めています)。以下がデフォルトであることは承知しています。これは大まかなテスト コードです。

class person
{
public:
    int age;
};

//sort predicate
class less_than_key
{
public:
    inline bool operator()(const person& pa , const person& pb)
    {
        return (pa.age < pb.age);
    }
};

//Binary Search predicate
class bsearch_predicate
{
    public:
    bool operator()(const person& pa)
    {
        return pa.age == n;
    }
    bsearch_predicate(int i):n(i) {}
    int n;
};

実装

    person p;
p.age = 24;

std::vector<person> vec;
vec.push_back(p);

std::sort(vec.begin(),vec.end(),less_than_key());

std::binary_search(vec.begin(),vec.end(),bsearch_predicate(24));

ここで binary_search はエラーを生成しますが、 std::find_if などで試してみるとエラーが発生します

std::find_if(vec.begin(),vec.end(),bsearch_predicate(24));

上記の作品。コードから std::binary_search でリンカー エラーが発生する理由を教えていただければ幸いです。リンカー エラーは次のとおりです。

Error   12  error C2676: binary '<' : 'const bsearch_predicate' does not define this operator or a conversion to a type acceptable to the predefined operator   d:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm    2978    1
Error   4   error C2784: 'bool std::operator <(const _Elem *,const std::basic_string<_Elem,_Traits,_Alloc> &)' : could not deduce template argument for 'const _Elem *' from 'const bsearch_predicate'  d:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm    2978    1
Error   10  error C2784: 'bool std::operator <(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)' : could not deduce template argument for 'const std::_Revranit<_RanIt,_Base> &' from 'const bsearch_predicate' d:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm    2978    1
Error   7   error C2784: 'bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)' : could not deduce template argument for 'const std::_Tree<_Traits> &' from 'const bsearch_predicate'  d:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm    2978    1
Error   3   error C2784: 'bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem *)' : could not deduce template argument for 'const std::basic_string<_Elem,_Traits,_Alloc> &' from 'const bsearch_predicate'    d:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm    2978    1
Error   5   error C2784: 'bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const std::basic_string<_Elem,_Traits,_Alloc> &)' : could not deduce template argument for 'const std::basic_string<_Elem,_Traits,_Alloc> &' from 'const bsearch_predicate'  d:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm    2978    1
Error   1   error C2784: 'bool std::operator <(const std::list<_Ty,_Ax> &,const std::list<_Ty,_Ax> &)' : could not deduce template argument for 'const std::list<_Ty,_Ax> &' from 'const bsearch_predicate' d:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm    2978    1
Error   2   error C2784: 'bool std::operator <(const std::move_iterator<_RanIt> &,const std::move_iterator<_RanIt2> &)' : could not deduce template argument for 'const std::move_iterator<_RanIt> &' from 'const bsearch_predicate'    d:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm    2978    1
Error   11  error C2784: 'bool std::operator <(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)' : could not deduce template argument for 'const std::pair<_Ty1,_Ty2> &' from 'const bsearch_predicate'   d:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm    2978    1
Error   9   error C2784: 'bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : could not deduce template argument for 'const std::reverse_iterator<_RanIt> &' from 'const bsearch_predicate'   d:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm    2978    1
Error   8   error C2784: 'bool std::operator <(const std::unique_ptr<_Ty,_Dx> &,const std::unique_ptr<_Ty2,_Dx2> &)' : could not deduce template argument for 'const std::unique_ptr<_Ty,_Dx> &' from 'const bsearch_predicate' d:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm    2978    1
Error   6   error C2784: 'bool std::operator <(const std::vector<_Ty,_Ax> &,const std::vector<_Ty,_Ax> &)' : could not deduce template argument for 'const std::vector<_Ty,_Ax> &' from 'const bsearch_predicate'   d:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm    2978    1
4

1 に答える 1

2

このbinary_search関数は等値演算子ではなく、順序を定義する不等値反復子を取ります。述語を小なり比較であるかのようにモデル化する必要があります。

その理由は、binary_searchアルゴリズムが引数の相対的な順序と、検索を続行する方向を決定するために探している要素について知る必要があるためです。pred(*it,value)どちらもtrue でない場合、要素は見つかったと見なされpred(value,*it)ます (どちらの値も他方よりも小さい場合、それらは同じです)。

于 2013-11-04T16:15:38.860 に答える