c++ - 在 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,解决方案非常简单,所以我用解决方案更新了我的问题!
解决方案
您可以使用 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;
}
推荐阅读
- android - 如何查询集合以获取特定文档?
- powershell - 根据服务名称创建excel工作表名称
- sql - 在 HANA 中使用 SELECT 进行 UPSERT
- firebase - 如何在用户未登录时创建密码正在更改的功能?
- azure - Azure 点到站点 VPN - 无法连接到对等 VNet 中的虚拟机
- wordpress - Woocommerce:在产品类别名称下列出某些产品属性值
- javascript - JS onclick 事件在 firefox 中不起作用,但在基于 codeigniter 和 bootstrap 的 chrome 中起作用
- mongodb - SpringBoot multipleRepositories <> 多个数据库集群
- hibernate - Hibernate:防止不同线程插入重复行
- c# - Parallel.for 循环执行