0

オンラインでいくつかのチュートリアルを調べました。私は自分で試してみましたが、問題はstd::sort()何も実行されません! ここに私のコード全体があります:

#include <string>
#include <iostream>
#include <iomanip>
#include <sstream> 
#include <algorithm>
#include <vector>
using namespace std;

#ifndef _card_h
#define _card_h

enum Suit {
    CLUBS, DIAMONDS, HEARTS, SPADES
};

enum Rank {
    TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE
};

class Card {
    public:
        Card();
        Card(Rank, Suit);
        ~Card();
        Rank GetRank();
        Suit GetSuit();
        string ToString();
    private:
        Rank rank;
        Suit suit;
};
#endif

Card::Card() {
}

Card::Card(Rank rank, Suit suit) {
    this->rank = rank;
    this->suit = suit;
}

Card::~Card() {}

Rank Card::GetRank() {
    return rank;
}

Suit Card::GetSuit() {
    return suit;
}

string Card::ToString() {
    string cardName = "";
    switch (rank) {
        case TWO   : cardName += "2"; break;
        case THREE : cardName += "3"; break;
        case FOUR  : cardName += "4"; break;
        case FIVE  : cardName += "5"; break;
        case SIX   : cardName += "6"; break;
        case SEVEN : cardName += "7"; break;
        case EIGHT : cardName += "8"; break;
        case NINE  : cardName += "9"; break;
        case TEN   : cardName += "T"; break;
        case JACK  : cardName += "J"; break;
        case QUEEN : cardName += "Q"; break;
        case KING  : cardName += "K"; break;
        case ACE   : cardName += "A"; break;
    }
    switch (suit) {
        case CLUBS    : cardName += "C"; break;
        case DIAMONDS : cardName += "D"; break;
        case HEARTS   : cardName += "H"; break;
        case SPADES   : cardName += "S"; break;
    }
    return cardName;
}

#ifndef _cardcomparer_h
#define _cardcomparer_h

class CardComparer {  
    public:
        bool operator() (Card*, Card*);
    private:
        Card* firstCard;
        Card* secondCard;
};
#endif

bool CardComparer::operator() (Card* firstCard, Card* secondCard) {
    this->firstCard = firstCard;
    this->secondCard = secondCard;
    cout << "in Cardcompare! " << endl;
    if (firstCard->GetRank() == secondCard->GetRank()) {
        return firstCard->GetSuit() > secondCard->GetSuit();
    }
    else {
        return firstCard->GetRank() > secondCard->GetRank();
    }
}

#ifndef _hand_h
#define _hand_h
const int CARDS_IN_HAND = 5;
class Hand {
    public:
        Hand(int);
        ~Hand();
        void AddCard(Card*);
        string ToString();

    private:
        int cardCount;
        int playerID;
        vector<Card*> cards;

};
#endif

Hand::Hand(int playerID) {
    this->playerID = playerID;
    cards.reserve(CARDS_IN_HAND);
    cardCount = 0;
}

Hand::~Hand() {
    cards.clear();
}

void Hand::AddCard(Card* newCard) {
    cards[cardCount] = newCard;
    cardCount++;
    sort(cards.begin(), cards.end(),CardComparer());
}

string Hand::ToString() {
    stringstream playerCards;
    playerCards << "Player " << this->playerID << " -";
    for (int i = 0; i < cardCount; i++ ){
        playerCards << " " << cards[i]->ToString();
    }
    return playerCards.str();
}

int main() {
    vector<Hand*> hands;
    hands.reserve(1);
    hands[0] = new Hand(0);
    hands[0]->AddCard(new Card((Rank)4, (Suit)1));
    hands[0]->AddCard(new Card((Rank)8, (Suit)2));
    hands[0]->AddCard(new Card((Rank)5, (Suit)1));
    hands[0]->AddCard(new Card((Rank)2, (Suit)0));
    hands[0]->AddCard(new Card((Rank)7, (Suit)3));
    cout << hands[0]->ToString() << endl;
    return 0;
}

問題は、133 行目 ( sort(cards.begin(), cards.end(),CardComparer());) が実行されないことです。コメントアウトしても結果は変わらないので、93( cout << "in Cardcompare! " << endl;) に余分な行を追加して、bool を使用した場合に何かを出力します。しかし、そうではありません。問題がどこにあるのかわかりません。ここで何が問題で、どうすれば修正できますか?

4

2 に答える 2

0

コードには、対処が必要な問題が数多くあります。最も重要なことの 1 つは、現在大量のメモリ リークが発生しているという事実です。メモリを宣言しvector<Card*>て割り当てていますが、解放していません。また、ベクターにデータを入力する方法も正しくありません。reserve 関数は実際に新しい要素を作成するのではなく、それらのためにメモリを予約するだけです。

これは、ソートを正しく機能させることを含む、クリーンアップされたバージョンです。うまくいけば、それを勉強することで、C++ についていくつかのことを学ぶことができます。

#include <string>
#include <iostream>
#include <iomanip>
#include <sstream> 
#include <algorithm>
#include <vector>
#include <memory>
using namespace std;

enum Suit {
    CLUBS, DIAMONDS, HEARTS, SPADES
};

enum Rank {
    TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE
};
const char *card_lookup[] = {"2", "3", "4", "5", "6", "7", "8", "9", "T", "J", "Q", "K", "A"};
const char *suit_lookup[] = {"C", "D", "H", "S" };

class Card {
    public:
        Card::Card() 
        { }
        Card::Card(Rank rank, Suit suit) 
        {
            this->rank = rank;
            this->suit = suit;
        }
        Card::~Card() 
        {}
        Rank Card::GetRank() const
        {
            return rank;
        }

        Suit Card::GetSuit() const
        {
            return suit;
        }
        string Card::ToString() {
            string cardName = card_lookup[rank];
            cardName += suit_lookup[suit];
            return cardName;
        }
    private:
        Rank rank;
        Suit suit;
};

bool operator<(const Card& lhs, const Card& rhs)
{
    if(lhs.GetRank() == rhs.GetRank())
        return lhs.GetSuit() < rhs.GetSuit();
    else
        return lhs.GetRank() < rhs.GetRank();

}

const int CARDS_IN_HAND = 5;
class Hand {
    public:
        Hand::Hand(int playerID) 
        {
            this->playerID = playerID;
        }
        Hand::~Hand() 
        { }

        void Hand::AddCard(Card newCard) 
        {
            cards.push_back(newCard);
        }
        string Hand::ToString() 
        {
            sort(cards.begin(), cards.end());

            stringstream playerCards;
            playerCards << "Player " << this->playerID << " -";
            for (auto it = cards.begin(), end = cards.end(); it != end; ++it)
                playerCards << " " << it->ToString();

            return playerCards.str();
        }

    private:
        int playerID;
        vector<Card> cards;

};


int main() {
    vector<Hand> hands;
    Hand h(1);
    h.AddCard(Card(SIX, DIAMONDS));
    h.AddCard(Card(TEN, HEARTS));
    h.AddCard(Card(SEVEN, DIAMONDS));
    h.AddCard(Card(FOUR, CLUBS));
    h.AddCard(Card(NINE, SPADES));
    hands.push_back(h);
    cout << hands[0].ToString() << endl;
    return 0;
}
于 2013-04-24T06:52:56.483 に答える