c ++中结构上的比较器函数

Comparator function in c++ on structures

过去几天我一直在尝试解决这个问题,但我想不出一个解决比较函数编码方式的方法。我想做的是按降序对分数进行排序,如果分数相同,则根据它们的字典顺序对它们进行排序 name.Below 是代码和预期输出以及我的输出。

代码

#include<bits/stdc++.h>
using namespace std;

struct Player {
    string name;
    int score;
}; 

int compare(Player p,Player q)
{
    if(p.score==q.score)
    return p.name.compare(q.name);
    else
    return q.score-p.score;
}
vector<Player> comparator(vector<Player> players) {
    sort(players.begin(),players.end(),compare);
    return players;
}

int main() {

    int n;
    cin >> n;
    vector< Player > players;
    string name;
    int score;
    for(int i = 0; i < n; i++){
        cin >> name >> score;
        Player p1;
        p1.name = name, p1.score = score;
        players.push_back(p1);
    }

    vector<Player > answer = comparator(players);
    for(int i = 0; i < answer.size(); i++) {
        cout << answer[i].name << " " << answer[i].score << endl;
    }
    return 0;
}

我的输出:

aleksa 150
aakansha 75
heraldo 50
david 100
amy 100

正确输出

aleksa 150
amy 100
david 100
aakansha 75
heraldo 50

假设您正在使用一个比较函数来输入 std::sort 方法,您的函数应该 return 一个布尔值。使用 == 开始 if 块,并且 return 在没有 abs 运算符的情况下计算分数之间的差异使得逻辑有点混乱。

基本上,当您 return int 类型并且它不等于 0 时,它被视为 true。因此,即使 q.score > p.score 或 p.score > q.score.

,你的 else 块也只会 return true

字符串的字典序比较有多种方式:Some of them are discussed here

bool compare(Player p, Player q){
    if(p.score == q.score){
        return p.name > q.name;
    }
    else{
        return p.score > q.score;
    }
}