2016-05-16 1 views
-3

クラスポインタの両端キューを並べ替えるには、オーバーロードされた演算子<に依存しますが、ソートが正しく機能しません。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; 
} 

任意のアイデアが参考になります。

+6

なぜポインタを使用していますか? 'std :: deque 'を使い、 'new'を使うのをやめてください。あなたはおそらくJavaの背景から来ていますか? – NathanOliver

+1

「aaaaaaaaaa」はどうですか?あなたの出力の一部ですか、または意図的に質問の質を下げましたか? –

+1

@MarcusMüllerおそらく自動的なコードのみの質問防止の事柄をハックするでしょう。 –

答えて

2

あなたはポインタの配列を並べ替えているので、コンパイラはポインタの組み込みの比較を使います。つまり、アドレスの順番で並べ替えることになります。

オブジェクトをソートしていないため、クラス内のoperator <は無視されます。 (あなたがいたのであれば、オブジェクトをオブジェクトではなくポインタとオブジェクトを比較する方法を定義しているので、まだ動作しません)

最も良いことは、適切な順序付けを定義することです。bool operator < (const CCard & card) const )とソートのオブジェクトとして、@ NathanOliverが提案したように。

ポインタを並べ替える場合は、2つのポインタをとって比較を行う関数を記述し、明示的にsortに渡す必要があります。

関連する問題