C++类指针的排序与重载运算符<
C++ sort deque of class pointers with overloading operator <
我想根据重载运算符对类指针的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
。
相关文章:
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 如何显式调用运算符<<
- 为什么COUT在朋友函数中不起作用,该功能超载了操作员&lt;&lt;这是一个iStream运算符
- C++运算符<<调用::ostream而不是std::osttream
- BOOST ::变体无法解决运算符&lt;&lt;对于STD :: Ostream
- 过载输出<<用于类的运算符,以打印其中的元组
- 重载运算符<<:此运算符函数的参数太多
- C++继承运算符<<
- 重载运算符<<用于模板类.即使使用好友关键字也无法获得私人会员
- 为什么字符串流运算符<<擦除原始值
- 关于使用运算符<<为新手提供C++中的模板
- 重载运算符<<输出地址而不是数据成员
- 错误:没有匹配'运算符<<"在'std::cout
- 重载运算符<<用于ostream语法
- 如何为运算符<<
- Qt过载数据流运算符<<
- 我可以使用define调用运算符<<
- 运算符<<(ostream&os,..)用于模板类
- 重载<<运算符错误C2804:二进制'运算符<<'参数太多
- Can运算符<<用于设计我们自己的输出显示方式