我正在尝试使用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!
我可能会在这里误解逻辑,但这对我没有任何意义....
感谢您的时间:)
答案 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>