我想在排序向量中找到第一个项目,其字段小于某个值x
我需要提供一个比较函数,将'x'与MyClass中的内部值进行比较,但我无法计算出函数声明。
我不能简单地重载'<'但是当args是'& MyClass'和'float'时我该怎么办?
float x;
std::vector< MyClass >::iterator last = std::upper_bound(myClass.begin(),myClass.end(),x);
答案 0 :(得分:16)
您传递给排序算法的功能是什么?您应该能够为upper_bound和lower_bound使用相同的那个。
进行比较的最简单方法是创建一个虚拟对象,并将关键字段设置为搜索值。然后比较将始终在相似的对象之间。
编辑:如果由于某种原因无法获得具有正确比较值的虚拟对象,则可以创建比较仿函数。仿函数可以为operator()提供三个重载:
struct MyClassLessThan
{
bool operator() (const MyClass & left, const MyClass & right)
{
return left.key < right.key;
}
bool operator() (const MyClass & left, float right)
{
return left.key < right;
}
bool operator() (float left, const MyClass & right)
{
return left < right.key;
}
};
正如你所看到的,这是很长的路要走。
答案 1 :(得分:8)
您可以通过在MyClass中创建MyClassLessThan的静态实例来进一步改进Mark的解决方案
class CMyClass
{
static struct _CompareFloatField
{
bool operator() (const MyClass & left, float right) //...
// ...
} CompareFloatField;
};
这样你可以通过以下方式调用lower_bound:
std::lower_bound(coll.begin(), coll.end(), target, CMyClass::CompareFloatField);
这使它更具可读性
答案 2 :(得分:2)
将lambda函数传递给upper_bound
float x;
MyClass target;
target.x_ = x;
std::vector< MyClass >::iterator last =
std::upper_bound(myClass.begin(),myClass.end(),target,
[](const MyClass& a, const MyClass& b){return a.x_ < b.x_;});
答案 3 :(得分:0)
我认为你需要的是std::bind2nd(std::less<MyClass>(), x)
。但是,当然,运营商&lt;必须为MyClass定义。
编辑:哦,我认为你需要一个MyClass的构造函数,它只接受一个浮点数,以便可以隐式转换它。但是,可能有更好的方法来做到这一点。