【问题标题】:compare function for upper_bound / lower_bound上界/下界的比较函数
【发布时间】:2009-05-15 16:12:49
【问题描述】:

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

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

【问题讨论】:

    标签: c++ algorithm stl


    【解决方案1】:

    您将什么函数传递给排序算法?您应该可以对 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;
        }
    };
    

    如您所见,这是很长的路要走。

    【讨论】:

    • 这就是问题所在,排序函数需要两个 const refs 到 MyClass 对象。搜索函数必须采用 MyClass 和浮点数。使用 bind2nd() 的同样问题
    • operator() 来比较事物 - 现在我为什么没想到!!!我使用 STL 的次数越多,我就越喜欢 python。谢谢
    • @chmike,是的,当然。谢谢。想知道为什么要花这么长时间才有人注意到吗?
    【解决方案2】:

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

    这使它更具可读性

    【讨论】:

    • 我仍然需要一个虚拟对象和一个 operator() 为每个成员 - 但你在阅读意图时更清楚 - 谢谢
    【解决方案3】:

    将 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_;});
    

    【讨论】:

      【解决方案4】:

      我认为你需要的是std::bind2nd(std::less&lt;MyClass&gt;(), x)。但是,当然,必须为 MyClass 定义 operator

      编辑:哦,我认为你需要一个 MyClass 的构造函数,它只接受一个浮点数,以便它可以被隐式转换。但是,可能有更好的方法来做到这一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 2021-01-14
        • 1970-01-01
        • 1970-01-01
        • 2014-04-14
        相关资源
        最近更新 更多