我正在尝试模拟“作业”进入打印机。已根据处理时间将作业添加到优先级队列。我还要进行另一个比较,即尽管处理时间长,但优先级为1的作业要比优先级为0的作业高。
这是我的代码的片段
struct Jobs{
int priority;
int processingStatus;
int arrivalTime;
int processingTime;
char jobType;
};
struct Comp {
bool operator()(const Jobs& a, const Jobs& b) {
return a.processingTime > b.processingTime;
}
};
void createJobs(Jobs jobsA[], Jobs jobsB[], Jobs jobsC[], Jobs jobsD[]) {
for (int i = 0; i < 100; i++) {
jobsA[i].arrivalTime = 4 + rand() % 3 + i;
jobsA[i].processingTime = 1 + rand() % 4;
jobsA[i].priority = 0;
jobsA[i].jobType = 'A';
jobsD[i].arrivalTime = 25 + rand() % 10 + i ;
jobsD[i].processingTime = 8 + rand() % 4;
jobsD[i].priority = 1;
jobsD[i].jobType = 'D';
}
}
答案 0 :(得分:2)
让您的比较器先于优先级较低的工作:
bool operator()(const Jobs& a, const Jobs& b) {
if (a.priority == b.priority {
return a.processingTime > b.processingTime;
} else {
return a.priority > b.priority;
}
}
答案 1 :(得分:0)
考虑以下代码:
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
,它将根据std::tuple::operator<
的技巧Jobs
对两个std::tie
对象进行字典比较。
我还添加了operator<<
,以简化输出Jobs
对象的过程,因此在main()
中进行测试更加方便。该程序的输出为:
3 1 4 2