【问题标题】:C++ std::set comparatorC++ std::set 比较器
【发布时间】:2010-11-06 20:44:43
【问题描述】:

这是代码:

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 * 之一时,似乎出现了问题,但我不确定最后一个。

任何帮助将不胜感激

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

【问题讨论】:

    标签: c++ set comparator stdset


    【解决方案1】:

    您必须定义一个非自反的关系,就像&lt; 一样——因此,将最后一对中的&lt;= 更改为&lt; 并将'>=' 更改为'>'在您的方法中进行比较。这就是 VC++ 正在诊断的内容。

    此外,给定一个正确编码的 &lt;-like 运算符,如果两个项目 a 和 b 使得 a

    【讨论】:

    • 谢谢你,解决了。非常感谢!
    • 很高兴我帮助解决了“调试断言失败”问题,但请阅读我关于“唯一性”的最新编辑——你确实需要一个多重集,就像 @Kasprzol 说的那样,如果你想保留多个比较器无法区分的项目。
    • 是的,我已经按照 Kasprozl 的建议将其转换为多重集!
    • 你能帮我解决类似的问题吗?即使我得到相同的“调试断言失败!”,我也无法解决它。设置比较器出错?我的问题的链接在这里:[链接]stackoverflow.com/questions/5823469/…
    【解决方案2】:

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

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

    【讨论】:

    • 我将其转换为 std::multiset,但出现了完全相同的问题。
    【解决方案3】:

    您不能在 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;
        }
    };
    

    【讨论】:

    • 集合是一组指针。它们都是独一无二的,即使有些具有相同的 -> 数量。这是确切的代码: multiset sorted; for (Reputation *rep = Reputation::GetReputationTable(); rep->Id; ++rep) sorted.insert(rep);
    • 哦,好吧,从示例中并不清楚...但是如果您存储指针,请使用指针
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 2016-07-07
    • 1970-01-01
    相关资源
    最近更新 更多