C++ std::set 比较器

标签 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 Failed!
File: ..\VC\include\xtree
Line: 638

Expression: invalid operator<

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

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

任何帮助将不胜感激

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

最佳答案

你必须定义一个非自反的关系,就像< -- 因此,更改 <=<以及方法中最后几次比较中的“>=”到“>”。这就是 VC++ 正在诊断的内容。

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

关于C++ std::set 比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1061152/

相关文章:

c++ - 微软的OpenMP自旋锁时间如何控制?

c++ - msvc9、iostream 和 2g/4g plus 文件

mysql - SQL INNER JOIN 来自同一个表的两个值数组

java - set.iterator()......我错在哪里?

Java Swing : Set starting time on timer and loop it

java - 按 HashMap 的值(按映射的值比较)对 HashMap 的数组列表进行排序

c++ - 进程间对象传递

c++ - 在 C++ 中修复类型转换警告的最佳方法

java - 使用 Java Streams 对嵌套对象进行分组和排序

ios - 将NSArray转换为在Objective-C或Swift中按频率排序的唯一值数组