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

时间:2019-06-16 22:24:06

标签: c++ sorting

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

#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
*/

3 个答案:

答案 0 :(得分:2)

拥有正确比较功能的一种简单方法是使用operator <中的std::tuple

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

答案 1 :(得分:1)

只需在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); }

答案 2 :(得分:0)

@ 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;),这可能会由于缓存行阻塞而破坏您的性能。