0

クラス内のメンバー関数として選択並べ替えを実装しようとしています。ユーザー入力によって合計プレーヤー数が取得されるクラスのオブジェクトを並べ替え、プレーヤーの名前とスコアもユーザーによって取得されます。

ユーザー入力によって取得される、クラス メンバーであるスコアのプロパティによってプレーヤー オブジェクトを並べ替えます。

私の問題は、オブジェクトの配列のクラスのメンバー関数ソートを呼び出すことができないメイン内で動けなくなったことです。

class Player{
private:
string name;
int score;

public:
void setStatistics(string, int) // simple setter, not writing the whole function
void sortPrint(int, Player []);
int getScore(){ return score; }
void print(){ cout << name << " " << score << endl; }
};

void Player::sortPrint(int n, Player arr[]){
int i, j, minIndex;
Player tmp;

for (i = 0; i < n - 1; i++) {
    int maxIndex = i;
    for (j = i + 1; j < n; j++) 
    {
          if (arr[j].getScore() > arr[minIndex].getScore())
          {
                minIndex = j;
          }
    }

    if (minIndex != i) {
          tmp = arr[i];
          arr[i] = arr[minIndex];
          arr[minIndex] = tmp;
    }

for(int i=0; i<n; i++){
arr[i].print(); // not sure with this too
}

}

};

int main(){
int n,score;
string name;

cout << "How many players ?" << endl;
cin >> n;

Player **players;
players = new Player*[n]; 

for(int i=0;i<n;i++) {

cout << "Player's name :" << endl;
cin >> name;
cout << "Player's total score:" << endl;
cin >> score;
players[i] = new Player;
players[i]->setStatistics(name,score); 

}

for(int i=0; i<n;i++){
players->sortPrint(n, players); // error here, dont know how to do this part
}

// returning the memory here, didn't write this part too.

}
4

3 に答える 3

0

よほどの理由がない限り、独自のソート アルゴリズムではなく、使用する必要があります。std::sort各プレイヤーのスコアを比較する比較関数を使用する必要があります。

以下は C++03 で機能するはずです。

bool comparePlayerScores(const Player* a, const player* b)
{
    return (a->getScore() < b->getScore());
}


// Returns the players sorted by score, in a new std::vector
std::vector<Player*> getSortedPlayers(Player **players, int num_players)
{
    std::vector<Player*> players_copy(players, players + num_players);
    std::sort(players_copy.begin(), players_copy.end(), comparePlayerScores);
    return players_copy;
}

void printSorted(Player **players, int num_players)
{
    std::vector<Player*> sorted_players = getSortedPlayers(players, num_players);
    // Could use iterators here, omitting for brevity
    for (int i = 0; i < num_players; i++) {
        sorted_players[i]->print();
    }
}

(または、クラスでスコアを比較する を定義することもできます。これにより、プレイヤーを または に保存operator<できます。)Playerstd::setstd::map

于 2013-10-22T07:54:50.220 に答える