Рассмотрим следующий код:
struct Jobs {
int priority;
int processingStatus;
int arrivalTime;
int processingTime;
char jobType;
bool operator <(const Jobs& other) const {
const auto neg_lhs = -processingTime;
const auto neg_rhs = -other.processingTime;
return std::tie(priority, neg_lhs) < std::tie(other.priority, neg_rhs);
}
friend std::ostream& operator <<(std::ostream& out, const Jobs& arg) {
return out << arg.arrivalTime;
}
};
int main() {
std::vector<Jobs> source {
// consecutive arrival times to distinguish the elements easily
Jobs {1, 1, 1, 1, 1},
Jobs {0, 1, 2, 1, 1},
Jobs {2, 2, 3, 1, 1},
Jobs {0, 2, 4, 1, 1}
};
std::priority_queue<Jobs> jobs(source.begin(), source.end());
while(!jobs.empty()) {
std::cout << jobs.top() << ' ';
jobs.pop();
}
}
Обратите внимание на наличие operator<
внутри фактического класса Jobs
, который будет лексикографически сравнивать два Jobs
объекта, используя трюк std::tie
, который опирается на std::tuple::operator<
.
Я также добавил operator<<
, чтобы упростить вывод Jobs
объектов, поэтому тестирование в main()
более удобно.Вывод этой программы:
3 1 4 2