【问题标题】:C++ Dynamic Array of Objects Sorting by Property按属性排序的 C++ 对象动态数组
【发布时间】:2013-10-22 07:32:53
【问题描述】:

我正在尝试将选择排序实现为类中的成员函数,以对通过用户输入获得总玩家数量的类的对象进行排序,同时获得玩家的姓名和分数用户也是。

我将根据玩家对象的分数属性对玩家对象进行排序,分数是类成员,由用户输入获得。

我的问题是,我被困在主目录中,无法为对象数组调用类的成员函数排序。

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.

}

【问题讨论】:

  • std::sort 有什么问题?
  • 您是为了教育/娱乐而自行排序,还是可以使用标准库?
  • 从书上做练习题,因为我没有来标准函数,我是这样做的。

标签: c++ arrays class sorting


【解决方案1】:

尝试将void Player::sortPrint(int n, Player arr[]) 替换为void Player::sortPrint(int n, Player*) 并调用类似players-&gt;sortPrint(n, *players) 的函数

【讨论】:

  • 但最好使用 std::vector 之类的 std 容器而不是数组并使用 std::sort
  • 它说表达式必须有指向类类型的指针,在main中的玩家下面,不能这样调用。
【解决方案2】:

您的问题是,players 是指向Player 数组的指针,而数组没有包含的成员函数。由于Player::sortPrint 不依赖于对象本身,因此将其声明为static 并像Player::sortPrint(n, players); 一样调用它

【讨论】:

    【解决方案3】:

    除非您有一个非常很好的理由不这样做,否则您应该使用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&lt; 来比较分数,这样您就可以将玩家存储在 std::setstd::map 中。)

    【讨论】:

      猜你喜欢
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 2021-06-15
      相关资源
      最近更新 更多