C ++的std ::设置比较(C++ std::set comparator)

2019-09-17 06:03发布

这是代码:

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 \包括\的XTree
行:638

表达:无效操作者<

在那之后,我可以选择“中止”,“重试”或“忽略”。 如果让我选择忽视更多的(相同的)来了,但它结束了完美的工作。

这个问题似乎发生时,我插入了声誉 - >金额==为*的前面插入信誉的一个,但我不知道这最后一个。

任何帮助将不胜感激

编辑:我想他们订购的顺序是先在递增的顺序积极的,那么倒序消极因素。 实施例:1 5 10 11 11 20 50 -1 -50 -5

Answer 1:

你必须定义一个关系,这是漫反射 ,就像<因此改变- <=<在你的方法近一比较和“> =”到“>”。 这是VC ++的诊断。

此外,给定一个正确编码, <-像操作者,如果两个项a和b是这样的:<B和B <A都为假,这些项目被认为是等价,因此只有一个将在该组被插入(它不是材料是否项目可以通过一些其他的比较加以区分:只有通过比较事项所隐含的等价关系)。



Answer 2:

在这些项目std::set必须是唯一的! (和较可比)如果你想有相同的值(如你所提供的样品)的多个项目使用std::multiset

见: http://www.cppreference.com/wiki/stl/set/start和http://www.cppreference.com/wiki/stl/multiset/start



Answer 3:

你不能插入相同的值到的std ::设置,它需要独特的价值。 使用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;
    }
};


文章来源: C++ std::set comparator