【发布时间】:2009-05-15 16:12:49
【问题描述】:
我想在排序后的向量中找到第一个字段小于某个值 x 的项目。
我需要提供一个比较函数,将“x”与 MyClass 中的内部值进行比较,但我无法计算出函数声明。
我不能简单地重载 '
float x;
std::vector< MyClass >::iterator last = std::upper_bound(myClass.begin(),myClass.end(),x);
【问题讨论】:
我想在排序后的向量中找到第一个字段小于某个值 x 的项目。
我需要提供一个比较函数,将“x”与 MyClass 中的内部值进行比较,但我无法计算出函数声明。
我不能简单地重载 '
float x;
std::vector< MyClass >::iterator last = std::upper_bound(myClass.begin(),myClass.end(),x);
【问题讨论】:
您将什么函数传递给排序算法?您应该可以对 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;
}
};
如您所见,这是很长的路要走。
【讨论】:
您可以通过在 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);
这使它更具可读性
【讨论】:
将 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_;});
【讨论】:
我认为你需要的是std::bind2nd(std::less<MyClass>(), x)。但是,当然,必须为 MyClass 定义 operator
编辑:哦,我认为你需要一个 MyClass 的构造函数,它只接受一个浮点数,以便它可以被隐式转换。但是,可能有更好的方法来做到这一点。
【讨论】: