2

这是代码:

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;
    }
};

这就是问题所在:

调试断言失败!
文件:..\VC\include\xtree
行:638

表达式:无效的运算符<

之后,我可以选择“中止”、“重试”或“忽略”。如果我选择忽略更多(相同的)出现,但它最终会完美运行。

当我将带有 ->Amount == 的 Reputation 插入到之前插入的 Reputation * 之一时,似乎会出现问题,但我不确定最后一个。

任何帮助将不胜感激

编辑:我希望它们的顺序首先是按升序排列的正序,然后是按降序排列的负序。示例:1 5 10 11 11 20 50 -1 -5 -50

4

3 回答 3

6

您必须定义一个不自反的关系,就像<-- 因此,在方法的最后几次比较中将<=to<和 '>=' 更改为 '>'。这就是 VC++ 正在诊断的内容。

此外,给定一个正确编码的<-操作符,如果两个项目 a 和 b 使得 a < b 和 b < a 都是假的,那么这些项目被认为是等价的,因此只有一个项目将被插入到集合中(是否重要并不重要)这些项目可以通过其他比较来区分:只有比较器隐含的等价关系才重要)。

于 2009-06-30T00:07:25.330 回答
1

中的项目std::set必须是唯一的!(并且不太可比)如果您想拥有多个具有相同值的项目(如您提供的示例),请使用std::multiset.

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

于 2009-06-30T00:01:33.533 回答
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;
    }
};
于 2009-06-30T00:04:40.827 回答