<操作员在不应该返回时返回true

时间:2014-04-11 09:28:44

标签: c++ sorting comparison operator-overloading

我正在尝试使用sort函数(sort(cards.begin(), cards.end());)将某些枚举按升序排序,但它似乎没有正确排序。它按顺序返回:

card3   {rank=SEVEN (7) suit=CLUBS (0) }
card4   {rank=TWO (2) suit=HEARTS (2) }
card5 = {rank=NINE (9) suit=SPADES (3) } 

我怀疑这是我的比较运算符重载的问题,这就是:

inline bool operator<(const Card& c1, const Card& c2)
{
    return c1.getRank() < c2.getRank() &&
           c1.getSuit() < c2.getSuit();
}

据我所知,在比较card3和card4时,只有比较的右边是真的,所以它应该返回false但是当我card3<card4时它返回true!

我可能会在这里误解逻辑,但这对我没有任何意义....

感谢您的时间:)

2 个答案:

答案 0 :(得分:5)

您的比较运算符未实现strict weak ordering,这是std::sort的要求。实现这一点的一种简单方法是使用词典比较。使用std::tie

可以轻松完成此操作
#include <tuple> // for std::tie

inline bool operator<(const Card& c1, const Card& c2)
{
  return std::tie(s1.getRank(), c1.getSuit()) < 
         std::tie(c2.getRank(), c2.getSuit());
}

在没有std::tie的情况下,你也可以自己推出。这个想法是你必须处理两个等级都相同的情况。

答案 1 :(得分:3)

通常,当您将事物与两个项目进行比较时,您可以这样做:

inline bool operator<(const Card& c1, const Card& c2)
{
    if(c1.getSuit() == c2.getSuit()) {
        return c1.getRank() < c2.getRank()
    } else {
        return c1.getSuit() < c2.getSuit();
    }
}

编辑...我没想到实际的结果订单...我想你想先通过Suit订购,然后按Rank排序......所以我只是在原来的帖子中恢复了订单。< / p>