gpt4 book ai didi

c++ - 我的代码中的 binary_search 谓词有什么问题

转载 作者:行者123 更新时间:2023-11-28 03:05:47 24 4
gpt4 key购买 nike

我正在阅读有关 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

最佳答案

binary_search 函数不采用相等运算符,而是采用定义顺序的不等式 迭代器。您必须将谓词建模为小于比较。

原因是binary_search 算法需要 了解参数的相对顺序和它正在查看的元素,以决定继续搜索的方向。当 pred(*it,value)pred(value,*it) 都不为真(如果两个值都不小于另一个,则它们是一样)

关于c++ - 我的代码中的 binary_search 谓词有什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19771978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com