Простое исправление — сортировка бланка по нескольким значениям

Я пытаюсь понять, как сортировать деку структур по двум значениям, а не по одному. У меня есть код, который отлично сортирует по arrival, но если два предмета пришли с одинаковыми pidЯ хотел бы, чтобы они были в порядке pid. Надеюсь, у меня есть смысл!

Например:

Процесс, который имеет pid из 1 и arrival 10 должно быть до процесса с pid из 2 с arrival 10, даже если процесс с pid 1 приходит позже в оригинальной деке.

struct Process{
int pid;
int burst;
int arrival;
};

int sortOnArrival (Process const &a, Process const &b){
return a.arrival < b.arrival;
}

int main(int argc, char *argv[]){

deque<Process> readyQueue;

// This is just pseudocode, but trust me, it works. :)
fill(readyQueue);

sort(readyQueue.begin(), readyQueue.end(), sortOnArrival);
}

0

Решение

Просто используйте подходящий объект сравнения. Например, вы можете использовать

struct sortOnPidAndArrival {
bool operator()(Process const& p0, Process const& p1) const {
return std::tie(p0.pid, p0.arrival) < std::tie(p1.pid, p1.arrival);
}
};

В случае, если вам интересно, почему я использую объект функции, а не указатель функции: код в этом объекте функции может быть полностью встроенным. Вызов через указатель функции не может.

6

Другие решения

Ваша функция сравнения должна учитывать все требования для сравнения.

int sortOnArrival (Process const &a, Process const &b) {
if( a.arrival == b.arrival ) return a.pid < b.pid;
return a.arrival < b.arrival;
}
3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector