Черга пріоритетів - це абстрактний тип даних, який фіксує ідею контейнера, до елементів якого прикріплені "пріоритети". Елемент найвищого пріоритету завжди відображається в передній частині черги. Якщо цей елемент видалено, наступний елемент з найвищим пріоритетом рухається вперед.
Стандартна бібліотека C ++ визначає шаблон класу priority_queue з наступними операціями:
push : Вставте елемент у чергу пріоритетів.
top : Повернути (не видаляючи) елемент із найвищим пріоритетом із черги пріоритетів.
pop : Вилучіть елемент з найвищим пріоритетом із черги пріоритетів.
size : повертає кількість елементів у черзі пріоритетів.
empty : Повертає true або false залежно від того, порожня черга пріоритетів чи ні.
Наступний фрагмент коду показує, як створити дві черги пріоритетів, одну, яка може містити цілі числа, а іншу, яка може містити рядки символів:
#include <queue>
priority_queue<int> q1;
priority_queue<string> q2;
Нижче наведено приклад використання черги пріоритетів:
#include <string>
#include <queue>
#include <iostream>
using namespace std;
int main()
{
piority_queue<string> pq;
pq.push("the quick");
pq.push("fox");
pq.push("jumped over");
pq.push("the lazy dog");
while (!pq.empty()) {
cout << pq.top() << endl;
pq.pop();
}
return 0;
}
Результатом роботи цієї програми є:
the quick
the lazy dog
jumped over
fox
Оскільки черга відповідає пріоритетній дисципліні, рядки друкуються від найвищого до найнижчого пріоритету.
Іноді потрібно створити пріоритетну чергу, щоб містити визначені користувачем об'єкти. У цьому випадку черзі пріоритетів потрібно знати критерій порівняння, який використовується для визначення того, які об’єкти мають найвищий пріоритет. Це робиться за допомогою об'єкта функції, що належить до класу, який перевантажує оператор (). Перевантажений () діє як <з метою визначення пріоритетів. Наприклад, припустимо, ми хочемо створити пріоритетну чергу для зберігання об’єктів Time. Об'єкт Time має три поля: години, хвилини, секунди:
struct Time {
int h;
int m;
int s;
};
class CompareTime {
public:
bool operator()(Time& t1, Time& t2)
{
if (t1.h < t2.h) return true;
if (t1.h == t2.h && t1.m < t2.m) return true;
if (t1.h == t2.h && t1.m == t2.m && t1.s < t2.s) return true;
return false;
}
}
Черга пріоритетів для зберігання часу відповідно до вищезазначеного критерію порівняння буде визначена наступним чином:
priority_queue<Time, vector<Time>, CompareTime> pq;
Here is a complete program:
#include <iostream>
#include <queue>
#include <iomanip>
using namespace std;
struct Time {
int h;
int m;
int s;
};
class CompareTime {
public:
bool operator()(Time& t1, Time& t2)
{
if (t1.h < t2.h) return true;
if (t1.h == t2.h && t1.m < t2.m) return true;
if (t1.h == t2.h && t1.m == t2.m && t1.s < t2.s) return true;
return false;
}
};
int main()
{
priority_queue<Time, vector<Time>, CompareTime> pq;
Time t[4] = { {3, 2, 40}, {3, 2, 26}, {5, 16, 13}, {5, 14, 20}};
for (int i = 0; i < 4; ++i)
pq.push(t[i]);
while (! pq.empty()) {
Time t2 = pq.top();
cout << setw(3) << t2.h << " " << setw(3) << t2.m << " " <<
setw(3) << t2.s << endl;
pq.pop();
}
return 0;
}
Програма друкує часи від останнього до раннього:
5 16 13
5 14 20
3 2 40
3 2 26
Якби ми хотіли, щоб найдавніші часи мали найвищий пріоритет, ми б перевизначили CompareTime таким чином:
class CompareTime {
public:
bool operator()(Time& t1, Time& t2)
{
if (t2.h < t1.h) return true;
if (t2.h == t1.h && t2.m < t1.m) return true;
if (t2.h == t1.h && t2.m == t1.m && t2.s < t1.s) return true;
return false;
}
};