C ++ lower_bound比较函数问题

时间:2017-03-19 09:16:37

标签: c++ stl binary-search

我在使用STL lower_bound函数时遇到了一些问题。我是c ++的新手。我需要对Biz类对象的矢量进行排序,所以我使用了这种类型:

bool cmpID(const Biz & a, const Biz & b) {
    return a.bizTaxID < b.bizTaxID; 
}
sort(bussiness_list.begin(), bussiness_list.end(), cmpID);

问题是当我尝试在另一个具有lower_bound的函数中通过bizTaxID找到对象Biz时。我以为我可以使用相同的函数cmpID,但显然不是:

taxID = itax; //function parameter, I am searching for the `Biz` with this ID
auto it = lower_bound(bussiness_list.begin(), bussiness_list.end(), taxID, cmpID);

我遇到编译错误:&#39; bool(const Biz&amp;,const Biz&amp;)&#39;:无法转换来自&#39; const std :: string&#39;的参数2到&#39; const Biz&amp;&#39;

我认为我可以使用相同的比较功能进行搜索以及排序。有人可以向我解释错误在哪里,以及lower_bound要求我传达的确切内容是什么?正如我所说,我是c ++的新手。

提前谢谢。

1 个答案:

答案 0 :(得分:3)

您需要对Biz个对象进行比较,而您需要搜索std::string个对象(假设itaxstd::string)。

最简单的方法是为Biz电话创建一个lower_bound对象,例如:

Biz searchObj;
searchObj.bizTaxID = itax;
auto it = lower_bound(bussiness_list.begin(), bussiness_list.end(), searchObj, cmpID);

然后编译器可以使用cmpID,因为它会尝试将容器中的Biz个对象与Biz对象searchObj进行比较。

或者,您可以提供比较运算符来将Biz对象与std::string进行比较:

inline bool cmpID(const Biz& biz, const std::string& str) 
{
    return biz.bizTaxID < str; 
}

inline bool cmpID(const std::string& str, const Biz& biz) 
{
    return str < biz.bizTaxID; 
}

另外,我建议您定义C ++运算符而不是函数,然后,不需要将cmpID传递给所有函数(编译器将选择要使用的好运算符):

inline bool operator<(const Biz & a, const Biz & b) 
{
    return a.bizTaxID < b.bizTaxID; 
}

inline bool operator<(const Biz& biz, const std::string& str) 
{
    return biz.bizTaxID < str; 
}

inline bool operator<(const std::string& str, const Biz& biz) 
{
    return str < biz.bizTaxID; 
}