C++在矢量中使用lower_bound进行搜索,并忽略小写/大写字母



如果我不关心大小写,我如何在向量中找到元素。例如,如果我在cmp中有name=";tOM";addr=";伦敦";并且我希望它找到具有值name="的元素;汤姆"addr=";伦敦";我保存在矢量中的?我附上整个程序https://onecompiler.com/cpp/3xy2j7dmd。

bool Company::cmpNA2 (const Company &a, const Company &b) 
{
if ( (strcasecmp(a.getName().c_str(), b.getName().c_str()) != 0) )
return ( strcasecmp(a.getName().c_str(), b.getName().c_str()) );

return ( strcasecmp(a.getAddr().c_str(), b.getAddr().c_str()));
}
bool CVATRegister::invoice ( const string  &name, const string &addr, unsigned int amount )
{
Company cmp(name, addr,"-1");
sort(DCompany.begin(), DCompany.end(), [](const Company & a, const Company & b)
{ 
if ( (strcasecmp(a.getName().c_str(), b.getName().c_str()) != 0) )
return ( strcasecmp(a.getName().c_str(), b.getName().c_str()) );

return ( strcasecmp(a.getAddr().c_str(), b.getAddr().c_str()));
});
auto itr = lower_bound(DCompany.begin(), DCompany.end(), cmp, &Company::cmpNA2);
// cout << itr->getTotalIncome() << itr->getId() << endl; <--- Nothing

第一件事是std::sort要求您返回truefalse。问题是strcasecmp返回一个int,表示第一个项目是在第二个项目之前、相等还是之后(-1,0,1(。这是三个值,而不仅仅是truefalse

为了简化你的代码,你可以做一些类似的事情:

bool CVATRegister::invoice ( const string  &name, const string &addr, unsigned int amount )
{
std::sort(DCompany.begin(), DCompany.end(), [](const Company & a, const Company & b)
{ 
return strcasecmp(a.getName().c_str(), b.getName().c_str()) < 0;
});
}

由于如果第一个项位于第二个项之前,则strcasecmp返回-1,因此如果结果为< 0,则谓词简单地返回true,否则返回false

最新更新