对相同其他数组旁边的数组进行排序

Sorting arrays next to other arrays which are the same

本文关键字:数组 排序 其他      更新时间:2023-10-16

我刚刚写了一个程序,程序按时间(分钟)对人进行排序。但是我应该在什么地方添加代码,如果分钟相同并且我也需要对秒进行排序

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
struct people{
string name;
int min;
int sec;
};
bool comp(const people &p1, const people &p2) {return (p1.min < p2.min); }
int main() {
int temp;
people z[6];
for (int i = 0; i < 6; i++) {
cin >> z[i].name;
cin >> z[i].min;
cin >> z[i].sec;
}
sort(z, z + 6, comp);
cout << endl;
for (int i = 0; i < 6; i++) {
cout << z[i].name << " " << z[i].min << " " << z[i].sec << endl;
}
return 0;
}
/*
input for example:
John 19 15  
Liza 9 59 
Michael 19 45 
Kira 2 37 
Thomas 5 41 
Justas 19 24
*/

拥有正确比较函数的一种简单方法是使用std::tupleoperator <

bool comp(const people &lhs, const people &rhs)
{
return std::tie(lhs.min, lhs.sec) < std::tie(rhs.min, rhs.sec);
}

只需在p1.min==p2.min时为 .sec 添加一个条件

bool comp(const people &p1, const people &p2) {
return (p1.min < p2.min || p1.min == p2.min && p1.sec < p2.sec); }

@Jarod42和@doug的答案肯定会起作用,但我认为这个解决方案更具可读性。

int getSeconds(const people &p){
const min2sec = 60.0;
return p.min * min2sec + p.sec;
}
bool comp(const people &p1, const people &p2) {        
return (getSeconds(p1) < getSeconds(p2)); 
}

@doug的解决方案可能会产生性能优势,因为您首先比较分钟,只有当它们不相等时,您才会查看秒。 如果性能被证明是一个问题(并且测量证明这是您的热点),您可以对此进行优化。请记住,数据结构包含此操作的多余数据(string name;),这可能会由于缓存行卡住而破坏性能。