簡體   English   中英

C ++動態對象數組按屬性排序

[英]C++ Dynamic Array of Objects Sorting by Property

我正在嘗試將選擇排序實現為類中的成員函數,以對類的對象進行排序,在該類對象中,通過用戶輸入獲取的玩家總數,也通過用戶獲取玩家的姓名和分數。

我將根據玩家分數的屬性對玩家對象進行排序,分數是通過用戶輸入獲得的類成員。

我的問題是,我陷入了無法調用對象數組的類成員函數排序的主要問題。

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.

}

嘗試將void Player::sortPrint(int n, Player arr[])替換為void Player::sortPrint(int n, Player*)並調用players->sortPrint(n, *players)函數

你的問題是, players是一個指向數組Player ,和數組沒有containees的成員函數。 由於Player::sortPrint不依賴於對象本身,因此將其聲明為static ,然后像Player::sortPrint(n, players);一樣調用它Player::sortPrint(n, players);

除非你有一個很好的理由,否則你應該使用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();
    }
}

(或者,您可以在Player類上定義一個operator<來比較分數,這可以讓您將玩家存儲在std::setstd::map 。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM