Сортировка массивов рядом с другими одинаковыми массивами - PullRequest
1 голос
/ 17 июня 2019

Я только что написал программу, в которой программа сортирует людей по времени (минутам). Но что и где я должен добавить код, если минуты одинаковые и мне нужно также отсортировать секунды

#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 ]

2 голосов
/ 17 июня 2019

Простой способ получить правильную функцию сравнения - использовать 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 голос
/ 17 июня 2019

Просто добавьте условие для .sec, когда p1.min==p2.min

bool comp(const people &p1, const people &p2) {
    return (p1.min < p2.min || p1.min == p2.min && p1.sec < p2.sec); }
0 голосов
/ 17 июня 2019

Ответы @ 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;) для этой операции, которые могут снизить производительность из-за застревания строк в кэше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...