在c ++优先级队列中有多个比较?

时间:2018-12-06 22:41:16

标签: c++ queue priority-queue

我正在尝试模拟“作业”进入打印机。已根据处理时间将作业添加到优先级队列。我还要进行另一个比较,即尽管处理时间长,但优先级为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';

    }
}

2 个答案:

答案 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