我在使用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::string
是itax
),比较函数将使用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/