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

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);

我收到一个编译器错误:'bool(const Biz&,const Biz&)':无法将参数2从'const std::string'转换为'const Biz&'

我以为我可以使用相同的比较功能进行搜索和排序。有人可以向我解释错误在哪里,lower_bound到底要求我传递什么?正如我所说,我是C++的新手。

先感谢您。

最佳答案

当您需要搜索Biz对象时(假设std::stringitax),比较函数将使用std::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;
}

关于c++ - C++ lower_bound比较函数问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42884862/

10-09 05:52