首页 > 解决方案 > 在 sort() 之后对 Struct 的特定成员使用 sort()

问题描述

我的代码正在vector<Struct>根据玩家在游戏中获得的积分进行排序。这工作正常。现在我想补充一点,如果相似点,它会按时间排序。使积分最高但时间最低的人在顶部。我的问题在于排序vector<Struct>而不破坏我之前为点所做的排序。这是我的代码

#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <algorithm>
#include <iomanip>

using namespace std;

struct Highscore{
    string Name;
    string Points;
    string Time;
};

Highscore parseToStruct(string data);
vector<string> Data = { "Ale, 01, 16", "Test, 10, 84", "Leon, 07, 61", "Cristian, 04, 43", "Kira, 09, 74", "Thomas, 01, 14", "Cooool, 05, 21", "Hohoho, 06, 56", "Neuer, 10, 81" };

bool compareByPoints(const Highscore &P1, const Highscore &P2){
    return (P1.Points > P2.Points) || (P1.Points == P2.Points && P1.Time < P2.Time);
}

vector<Highscore> sorting(){
    vector<Highscore> Test(Data.size());
    transform(Data.begin(), Data.end(), Test.begin(), parseToStruct);
    sort(Test.begin(), Test.end(), compareByPoints);
    //if I change compareByPoints with compareByTime it shows me the lowest time, but not in combination with Points
    return Test;
}

Highscore parseToStruct(string data){
    Highscore Style;
    vector<string> parse;
    stringstream s_stream(data);
    while (s_stream.good()){
        string substr;
        getline(s_stream, substr, ',');
        parse.push_back(substr);
    }
    Style.Name = parse.at(0);
    Style.Points = parse.at(1);
    Style.Time = parse.at(2);
    return Style;
}

int main(){
    size_t fieldWidth = 8;
    vector<Highscore> HighscoreList;
    HighscoreList = sorting();
    cout << " _________________________________________________\n"
        << "|                    HIGHSCORE                    |\n"
        << "|       NAME        |  POINTS  |  TIME (s)        |" << endl;
    for (const auto &Highscore : HighscoreList){
        cout << "|"
            << setw(fieldWidth + 10) << left << Highscore.Name << " | "
            << setw(fieldWidth) << left << Highscore.Points << " | "
            << setw(fieldWidth + 8) << left << Highscore.Time << " | " << endl;

    }
    cout << "|_________________________________________________|" << endl;

    cin.clear();
    cin.ignore(cin.rdbuf()->in_avail());
    cin.get();
    return 0;
}

编辑:感谢@Lala5th,解决方案非常简单,所以我用解决方案更新了我的问题!

标签: c++sortingvectorstruct

解决方案


您可以使用 lambda 作为自定义比较器,并在一个函数中进行点和时间比较。

std::sort(Test.begin(), Test.end(), [](const Highscore &P1, const Highscore &P2) {
     if (P1.Points == P2.Points)
     {
         return P1.Time < P2.Time;
     }

     return P1.Points > P2.Points;
}

推荐阅读