我想对类指针的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;
}
任何想法都会有所帮助。
答案 0 :(得分:2)
您正在对指针数组进行排序,因此编译器会使用指针的内置比较 - 因此您最终会按地址顺序进行排序。
您的班级中的operator <
会被忽略,因为您不会对对象进行排序。 (如果你仍然无法工作,因为你已经定义了如何将对象与指针进行比较,而不是将对象与对象进行比较。)
最好的办法是定义一个正确的排序(bool operator < (const CCard & card) const
)并对对象进行排序,如@NathanOliver建议的那样。
如果你真的想要对指针进行排序,你将不得不编写一个函数来进行比较,得到两个指针,然后将它明确地传递给sort
。