C ++ std :: set comparator

时间:2009-06-29 23:56:47

标签: c++ set comparator stdset

这是代码:

struct comp
{
    bool operator()(Reputation *one, Reputation *two)
    {
        if (one->Amount < 0 && two->Amount >= 0)
            return false;
        if (one->Amount >= 0 && two->Amount < 0)
            return true;

        if (one->Amount >= 0)
            return one->Amount <= two->Amount;
        else
            return one->Amount >= two->Amount;
    }
};

这就是问题所在:

  

Debug Assertion失败!
  文件:.. \ VC \ include \ xtree
  行:638

     

表达式:无效的运算符&lt;

之后,我可以选择“Abort”,“Retry”或“Ignore”。如果我选择忽略更多(相同的),但最终会完美地运作。

当我将 - &gt; Amount ==的声誉插入到之前插入的声望*之一时,似乎会出现问题,但我不确定最后一个。

非常感谢任何帮助

编辑:我希望他们订购的订单首先是按顺序排列的顺序,然后按顺序排列是负数。示例:1 5 10 11 11 20 50 -1 -5 -50

3 个答案:

答案 0 :(得分:6)

您必须定义 irreflexive 的关系,就像<一样 - 因此,将<=更改为<,将'&gt; ='更改为'&GT;'在你方法的最后几次比较中。这就是VC ++诊断的内容。

此外,给定正确编码的<-类似运算符,如果两个项a和b是a&lt; b和b&lt; a都是假的,那些项目被认为是等价的,因此只有一个项目将被插入集合中(这些项目是否可以通过其他比较来区分,这是不重要的:只有比较器所暗示的等价关系很重要。)

答案 1 :(得分:1)

std::set中的项目必须是唯一的! (且可比性较低)如果您想要具有相同值的多个项目(例如您提供的样本),请使用std::multiset

请参阅:http://www.cppreference.com/wiki/stl/set/starthttp://www.cppreference.com/wiki/stl/multiset/start

答案 2 :(得分:0)

您不能将相同的值插入std :: set,它需要唯一的值。使用std :: multiset。

对于你的有趣订购,这似乎有效:

struct comp
{
    bool operator()(const Reputation *a, const Reputation *b)
    {
        if (a->Amount < 0 && b->Amount < 0)
            return a->Amount > b->Amount;
        else if (a->Amount < 0) return false;
        else if (b->Amount < 0) return true;
        else return a->Amount < b->Amount;
    }
};