Несколько сравнений в очереди приоритетов c ++? - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь смоделировать «задания», поступающие в принтер.Задания были добавлены в очередь приоритетов на основе времени обработки.Я также хотел бы провести еще одно сравнение, где задания с приоритетом 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 голосов
/ 07 декабря 2018

Сделайте так, чтобы ваш компаратор заказывал работы с более высоким приоритетом, прежде чем те с более низким приоритетом:

bool operator()(const Jobs& a, const Jobs& b) {
    if (a.priority == b.priority {
         return a.processingTime > b.processingTime;
    } else {
         return a.priority > b.priority;
    }
 }
0 голосов
/ 07 декабря 2018

Рассмотрим следующий код:

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
...