0

ベクトルを使用して相互に作用するカードの複数のデッキをプログラムする必要がある課題に取り組んでいます (たとえば、メイン デッキから 1 枚のカードを削除して別のカードに追加するなど)。割り当ては、カード構造体からオーバーロードされた「より小さい」演算子を使用して、std::lower_bound 関数と組み合わせてカードの正しい順序を決定する必要があることを示しています。これまでのところ、これは私が持っているものです:

void CardDeck::Add(const Card& card)
{
    m_Cards.insert(std::lower_bound(m_Cards.begin(),m_Cards.end(),card,*insert smaller than operator here*),card);
}

Card 構造体のオーバーロードされた「より小さい」演算子は次のとおりです。列挙の所定の順序に基づいて、ランクとカードのスーツを比較します。

friend bool operator< (const Card& lhs, const Card& rhs)
{
    if(lhs.m_Suit < rhs.m_Suit || (lhs.m_Suit == rhs.m_Suit && lhs.m_Rank < rhs.m_Rank))
    {
        return true;
    }
}

どんな助けでも大歓迎です。割り当ては、オーバーロードされた演算子を使用する必要があることを示しています。独自の単純な「IsSmallerThan()」メソッドを作成することは許可されていません。

どうもありがとう。

編集:問題をマークするのを忘れました。コメントの追加情報。

4

2 に答える 2

2

デフォルトでstd::lower_boundは、イテレータの後ろの型に小なり演算子を使用します。独自の を定義することによりoperator <、lower_bound は正しいことを行う必要があります。つまり、このように呼び出します

std::lower_bound(m_cards.begin(), m_cards.end(), card);

適切operator <に定義されたカード タイプを指定してください。

指摘すべきことの1つは、コードを次のoperator <ように簡略化できることです

friend bool operator< (const Card& lhs, const Card& rhs)
{
   return lhs.m_Suit < rhs.m_Suit || 
       (lhs.m_Suit == rhs.m_Suit && lhs.m_Rank < rhs.m_Rank);
}

(これにより、コードの微妙なバグも修正されます)。

于 2013-10-31T17:14:38.833 に答える