具有重载运算符的类指针的C ++排序deque<

时间:2016-05-16 19:33:49

标签: c++

我想对类指针的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;
}

任何想法都会有所帮助。

1 个答案:

答案 0 :(得分:2)

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

您的班级中的operator <会被忽略,因为您不会对对象进行排序。 (如果你仍然无法工作,因为你已经定义了如何将对象与指针进行比较,而不是将对象与对象进行比较。)

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

如果你真的想要对指针进行排序,你将不得不编写一个函数来进行比较,得到两个指针,然后将它明确地传递给sort