C++类指针的排序与重载运算符<

C++ sort deque of class pointers with overloading operator <

本文关键字:运算符 lt 重载 指针 排序 C++      更新时间:2023-10-16

我想根据重载运算符对类指针的deque进行排序<但排序不正确。

程序显示:

Suit: 1 Number: 1
Suit: 1 Number: 2
...
Suit: 1 Number: 13
Suit: 2 Number: 1
...

但排序后应该是这样的:

Suit: 1 Number: 2
Suit: 1 Number: 3
...
Suit: 1 Number: 13
Suit: 1 Number: 1
Suit: 2 Number: 2
...

这是我的代码:

class CCard
{
private:
    int m_suit;
    int m_number;
public:
    CCard(int suit, int number) : m_suit(suit), m_number(number) {}
ostream& Output(ostream& toStream)
{
    return toStream<<"Suit: "<<m_suit<<" Number: "<<m_number<<endl;
}
    bool operator < (const CCard *card)const
    {
        if(m_suit < card->m_suit) { return true; }
        else if(m_suit > card->m_suit) { return false; }
        else
        {
            if(m_number == card->m_number) { return false; }
            else
            {
                if(m_number == 1) { return false; }
                else if(card->m_number == 1) { return true; }
                else { return m_number < card->m_number; }
            }
        }
    }
};
int main()
{
    deque<CCard*> test;
    for(int i = 1; i <= 4; i++)
    {
        for(int j = 1; j <= 13; j++)
        {
            test.push_back(new CCard(i,j));
        }
    }
    sort(test.begin(),test.end());
    for(deque<CCard*>::iterator it = test.begin(); it != test.end(); ++it)
    {
        (*it)->Output(cout);
    }
    system("pause");
    return 0;
}

任何想法都会有所帮助。

您正在对指针数组进行排序,因此编译器使用内置的指针比较功能,因此您最终会按地址顺序进行排序。

类中的operator <将被忽略,因为您没有对对象进行排序。(如果你是这样的话,它仍然不起作用,因为你已经定义了如何将对象与指针进行比较,而不是将对象与对象进行比较。)

最好的做法是定义一个正确的排序(bool operator < (const CCard & card) const)并对对象进行排序,正如@NathanOliver所建议的那样。

如果你真的想对指针进行排序,你必须编写一个函数,用两个指针进行比较,并将其显式传递给sort