質問: (カードゲームのログの解析プログラム中、)スコアから順位付けをするコードを書いています。書けたことは書けたのですが、かなり複雑になってしまい、もっと簡単な方法、それこそ、標準STLが用意してくれた方法はないかと調べてみたのですが、自分では見つけられなかったので、御存知の方がいらっしゃれば御教授願います。 自分が書いたコードの概要 ``` 構造体 R{ 整数型 スコア,順位,プレイヤーID; } R データ[人数]; 人数分、データ[プレイヤーID].スコアをセット; 人数分、データ[プレイヤーID].プレイヤーIDをセット; std::sortでスコア順にデータをソート; 人数分、データ[i].順位をセット; std::sortでプレイヤーID順にデータをソート; ``` 現在検討中のコード1 (Stack Overflowからヒントをもらった) ``` 構造体 R{ 整数型 スコア,順位; } R データ[人数]; R* 順番[人数]; 人数分、データ[プレイヤーID].スコアをセット; 人数分、順番[プレイヤーID]にデータ[人数]のアドレスをセット; std::sortでスコア順に順番をソート; 人数分、順番[i]->順位をセット; ``` 現在検討中のコード2 ``` 構造体 R{ 整数型 スコア,順位; } R データ[人数]; 人数分、データ[プレイヤーID].スコアをセット; 人数分、順番[プレイヤーID]に、std::count_ifで自分のスコアより大きいスコアを持つ人数+1をセット; ``` ちなみにプレイヤー数は4人以下です。
回答: こんにちは。 std::multimapを使う案です。 もっとスマートな方法がありそうな気もしますが、ソートと言えばmapしか思いつかない...(setは面倒ですし) ``` 構造体 R { 整数型 スコア,順位; }; R データ[人数]; { std::multimap<整数型, 整数型> m; std::pair(スコア, プレイヤーID)を人数分mへemplace; 整数型 i=0; for (auto&& プレイヤー : m) { データ[プレイヤー.プレイヤーID].順位=++i; データ[プレイヤー.プレイヤーID].スコア=プレイヤー.スコア; } } ``` 順位は同じスコアの時の対処が必要です。