上限/下限比较功能

问题描述 投票:14回答:4

我想在排序向量中找到字段小于某个值x的第一项。我需要提供一个比较函数,将MyClass中的“ x”与内部值进行比较,但是我无法计算出函数声明。我不能简单地重载'

 float x;
 std::vector< MyClass >::iterator last = std::upper_bound(myClass.begin(),myClass.end(),x);
c++ algorithm stl
4个回答
18
投票

您将什么功能传递给排序算法?您应该能够对upper_bound和lower_bound使用相同的设置。

进行比较的最简单方法是创建一个虚拟对象,并将键字段设置为您的搜索值。然后比较将始终在相似对象之间进行。

Edit:如果由于某种原因而无法获得具有正确比较值的虚拟对象,则可以创建一个比较函子。函子可以为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;
    }
};

您可以看到,这是很长的路要走。


9
投票

您可以通过在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);

这使它更具可读性


0
投票

我认为您需要的是std::bind2nd(std::less<MyClass>(), x)。但是,当然,必须为MyClass定义operator

编辑:哦,我认为您将需要MyClass的构造函数,该构造函数仅接受浮点数,以便可以进行隐式转换。但是,可能会有更好的方法来进行此操作。


0
投票

将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_;});
© www.soinside.com 2019 - 2024. All rights reserved.