比较upper_bound/lower_bound的函数

Mar*_*ett 13 c++ algorithm stl

我想在排序向量中找到第一个项目,其字段小于某个值x.
我需要提供一个比较函数,将'x'与MyClass中的内部值进行比较,但我无法计算出函数声明.
我不能简单地重载'<'但是当args是'&MyClass'和'float'时我该怎么做?

 float x;
 std::vector< MyClass >::iterator last = std::upper_bound(myClass.begin(),myClass.end(),x);
Run Code Online (Sandbox Code Playgroud)

Mar*_*som 17

你传递给排序算法的功能是什么?您应该能够为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;
    }
};
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,这是很长的路要走.


Gho*_*der 8

您可以通过在MyClass中创建MyClassLessThan的静态实例来进一步改进Mark的解决方案

class CMyClass 
{
   static struct _CompareFloatField
   {
      bool operator() (const MyClass & left, float right) //...
      // ...
   } CompareFloatField;
};
Run Code Online (Sandbox Code Playgroud)

这样您就可以通过以下方式调用lower_bound:

std::lower_bound(coll.begin(), coll.end(), target, CMyClass::CompareFloatField);
Run Code Online (Sandbox Code Playgroud)

这使它更具可读性