Как использовать C ++ Priority_queue?

How Use C Priority_queue



В C ++ очередь - это структура данных списка, в которой первый элемент, который должен быть помещен в список, является первым элементом, который должен быть удален, когда должно произойти удаление. Очередь с приоритетом в C ++ похожа, но имеет некоторый порядок; первым удаляется элемент с наибольшим значением. Очередь с приоритетом все еще можно настроить так, чтобы первым удалялся элемент с наименьшим значением. Любая очередь должна иметь как минимум толкать() функция и поп () функция. В толкать() функция добавляет новый элемент сзади. Для нормальной очереди поп () функция удаляет первый элемент, когда-либо вставленный. Для очереди с приоритетом поп () функция удаляет элемент с наивысшим приоритетом, который может быть самым большим или самым маленьким, в зависимости от схемы упорядочивания.

Чтобы использовать C ++ priority_queue, программа должна начинаться с такого кода:







#включают
#включают
с использованием пространство именчасы;

Включает библиотеку очередей в программу.



Чтобы продолжить чтение, читатель должен иметь базовые знания C ++.



Содержание статьи

Базовая конструкция

Прежде чем использовать структуру данных, она должна быть построена. Конструкция здесь означает создание экземпляра объекта из класса очереди библиотеки. Тогда объект очереди должен иметь имя, данное ему программистом. Самый простой синтаксис для создания очереди с приоритетом:





priority_queue<тип>queueName;

В этом синтаксисе сначала удаляется наибольшее значение. Пример создания:

priority_queue<int>pq;

или



priority_queue<символ>pq;

Вектор и двухсторонняя очередь - это две структуры данных в C ++. Priority_queue может быть создан с любым из них. Синтаксис для создания очереди приоритетов из векторной структуры:

priority_queue<тип, вектор<того же типа>, сравнивать>pq;

Пример этого экземпляра:

priority_queue<int, вектор<int>, меньше<int> >pq;

Обратите внимание на пробел между> и> в конце объявления. Это сделано для предотвращения путаницы с >>. Код сравнения по умолчанию меньше, что означает, что сначала будет удалено наибольшее, а не обязательно первое значение. Итак, оператор создания можно просто записать как:

priority_queue<int, вектор<int> >pq;

Если сначала нужно удалить наименьшее значение, тогда инструкция должна быть:

priority_queue<int, вектор<int>, больше<int> >pq;

Важные функции-члены

Функция push ()
Эта функция помещает значение, являющееся ее аргументом, в priority_queue. Он возвращает пустоту. Следующий код иллюстрирует это:

priority_queue<int>pq;

pq.толкать(10);
pq.толкать(30);
pq.толкать(двадцать);
pq.толкать(пятьдесят);
pq.толкать(40);

Эта priority_queue получила 5 целочисленных значений в порядке 10, 30, 20, 50, 40. Если все эти элементы должны быть извлечены из очереди приоритетов, то они появятся в порядке 50, 40, 30, 20, 10.

Функция pop ()
Эта функция удаляет из очереди priority_queue значение с наивысшим приоритетом. Если код сравнения больше, то он удалит элемент с наименьшим значением. При повторном вызове удаляет следующий элемент с наименьшим значением из остальных; вызывается снова, он удаляет следующее наименьшее из имеющихся значений и так далее. Он возвращает пустоту. Следующий код иллюстрирует это:

priority_queue<символ, вектор<символ>, больше<int> >pq;
pq.толкать('к');pq.толкать('c');pq.толкать('b');pq.толкать('А также');pq.толкать('d');

Обратите внимание, что для вызова функции-члена после имени объекта должна стоять точка, а затем - функция.

Функция top ()
В поп () функция удаляет следующее значение с наивысшим приоритетом, но не возвращает его, поскольку поп () это пустая функция. Использовать Топ() функция, чтобы узнать значение наивысшего приоритета, которое необходимо удалить следующим. В Топ() функция возвращает копию значения наивысшего приоритета в priority_queue. Следующий код, где следующее значение наивысшего приоритета является наименьшим значением, иллюстрирует это.

priority_queue<символ, вектор<символ>, больше<int> >pq;
pq.толкать('к');pq.толкать('c');pq.толкать('b');pq.толкать('А также');pq.толкать('d');
символch1знак равноpq.Топ();pq.поп();
символch2знак равноpq.Топ();pq.поп();
символch3знак равноpq.Топ();pq.поп();
символch4знак равноpq.Топ();pq.поп();
символch5знак равноpq.Топ();pq.поп();

Стоимость<<ch1<<''<<ch2<<''<<ch3<<''<<ch4<<''<<ch5<<' п';

Результатом будет ‘a’ ‘b’ ‘c’ ‘d’ ‘e’.

Функция empty ()
Если программист использует Топ() в пустой очереди priority_queue, после успешной компиляции он получит сообщение об ошибке, например:

Ошибка сегментации(ядро сброшено)

Поэтому всегда проверяйте, не пуста ли очередь приоритетов, прежде чем использовать Топ() функция. В пустой() функция-член возвращает логическое значение true, если очередь пуста, и false, если очередь не пуста. Следующий код иллюстрирует это:

priority_queue<int>pq;
inti1знак равно 10; inti2знак равно 30; inti3знак равно двадцать; inti4знак равно пятьдесят; inti5знак равно 40;
pq.толкать(i1);pq.толкать(i2);pq.толкать(i3);pq.толкать(i4);pq.толкать(i5);

в то время как(!pq.пустой())
{
Стоимость <<pq.Топ() << '';
pq.поп();
}
Стоимость << ' п';

Другие функции очереди приоритетов

Функция size ()
Эта функция возвращает длину очереди приоритетов, как показано в следующем коде:

priority_queue<int>pq;
inti1знак равно 10; inti2знак равно 30; inti3знак равно двадцать; inti4знак равно пятьдесят; inti5знак равно 40;
pq.толкать(i1);pq.толкать(i2);pq.толкать(i3);pq.толкать(i4);pq.толкать(i5);

intlenзнак равноpq.размер();
Стоимость <<len<< ' п';

Выход 5.

Функция swap ()
Если две очереди priority_queues имеют одинаковый тип и размер, то они могут быть заменены этой функцией, как показано в следующем коде:

priority_queue<int>pq1;
inti1знак равно 10; inti2знак равно 30; inti3знак равно двадцать; inti4знак равно пятьдесят; inti5знак равно 40;
pq1.толкать(i1);pq1.толкать(i2);pq1.толкать(i3);pq1.толкать(i4);pq1.толкать(i5);

priority_queue<int>pqA;
intit1знак равно 1; intit2знак равно 3; intit3знак равно 2; intit4знак равно 5; intit5знак равно 4;
pqA.толкать(it1);pqA.толкать(it2);pqA.толкать(it3);pqA.толкать(it4);pqA.толкать(it5);

pq1.поменять местами(pqA);

в то время как(!pq1.пустой())
{
Стоимость <<pq1.Топ() << '';
pq1.поп();
} Стоимость<<' п';

в то время как(!pqA.пустой())
{
Стоимость <<pqA.Топ() << '';
pqA.поп();
} Стоимость<<' п';

Результат:

& emsp; 5 & emsp; 4 & emsp; 3 & emsp; 2 & emsp; 1
& emsp; 50 & emsp; 40 & emsp; 30 & emsp; 20 & emsp; 10

Место () Функция
В место () функция аналогична функции push. Следующий код иллюстрирует это:

priority_queue<int>pq1;
inti1знак равно 10; inti2знак равно 30; inti3знак равно двадцать; inti4знак равно пятьдесят; inti5знак равно 40;
pq1.поставить(i1);pq1.поставить(i2);pq1.поставить(i3);pq1.поставить(i4);pq1.поставить(i5);

в то время как(!pq1.пустой())
{
Стоимость <<pq1.Топ() << '';
pq1.поп();
} Стоимость<<' п';

Результат:

50 40 30 20 10

Строковые данные

При сравнении строк следует использовать строковый класс, а не прямое использование строковых литералов, потому что он будет сравнивать указатели, а не фактические строки. Следующий код показывает, как используется строковый класс:

#включают
priority_queue<нить>pq1;
строка s1знак равнонить('ручка'), s2знак равнонить('карандаш'), s3знак равнонить('тетрадь'), s4знак равнонить('учебник'), s5знак равнонить('правитель');

pq1.толкать(s1);pq1.толкать(s2);pq1.толкать(s3);pq1.толкать(s4);pq1.толкать(s5);
в то время как(!pq1.пустой())
{
Стоимость <<pq1.Топ() << '';
pq1.поп();
} Стоимость<<' п';

Результат:

& emsp; учебник & emsp; линейка & emsp; карандаш & emsp; ручка & emsp; тетрадь

Другие конструкции приоритетной очереди

Явное создание из вектора
Очередь с приоритетом может быть создана явно из вектора, как показано в следующем коде:

#включают
вектор<int>vtrзнак равно {10,30,двадцать,пятьдесят,40};

priority_queue<int>pq(vtr.начинать(), vtr.конец());

в то время как(!pq.пустой())
{
Стоимость <<pq.Топ() << '';
pq.поп();
} Стоимость<<' п';

Результат: 50 40 30 20 10. На этот раз также должен быть включен заголовок вектора. Аргументы функции-конструктора принимают указатели начала и конца вектора. Тип данных для вектора и тип данных для priority_queue должны совпадать.

Чтобы сделать наименьшее значение приоритетом, объявление конструктора будет следующим:

priority_queue<int, вектор<int>, больше>int> >pq(vtr.начинать(), vtr.конец());

Явное создание из массива
Очередь с приоритетом может быть создана явно из массива, как показано в следующем коде:

intобр[] знак равно {10,30,двадцать,пятьдесят,40};

priority_queue<int>pq(обр, обр+5);

в то время как(!pq.пустой())
{
Стоимость <<pq.Топ() << '';
pq.поп();
} Стоимость<<' п';

Результатом будет: 50 40 30 20 10. Аргументы функции-конструктора принимают указатели начала и конца массива. arr возвращает указатель начала, arr + 5 возвращает указатель сразу за массивом, а 5 - размер массива. Тип данных для массива и тип данных для priority_queue должны совпадать.

Чтобы сделать наименьшее значение приоритетом, объявление конструктора будет следующим:

priority_queue<int, вектор<int>, больше<int> >pq(обр, обр+5);

Примечание. В C ++ priority_queue фактически называется адаптером, а не просто контейнером.

Пользовательский код сравнения

Наличие всех значений в очереди приоритетов по возрастанию или по убыванию - не единственный вариант для очереди с приоритетом. Например, список из 11 целых чисел для максимальной кучи:

88, 86, 87, 84, 82, 79,74, 80, 81 ,,, 64, 69

Наивысшее значение - 88. За ним следуют два числа: 86 и 87, которые меньше 88. Остальные числа меньше этих трех чисел, но не совсем по порядку. В списке две пустые ячейки. Числа 84 и 82 меньше 86. Числа 79 и 74 меньше 87. Числа 80 и 81 меньше 84. Числа 64 и 69 меньше 79.

Размещение чисел соответствует критериям максимальной кучи - см. Ниже. Чтобы предоставить такую ​​схему для priority_queue, программист должен предоставить свой собственный код сравнения - см. Ниже.

Заключение

Priority_queue C ++ - это очередь «первым пришел - первым обслужен». Функция-член, толкать(), добавляет новое значение в очередь. Функция-член, Топ(), читает верхнее значение в очереди. Функция-член, поп (), удаляет без возврата верхнего значения очереди. Функция-член, пустой(), проверяет, пуста ли очередь. Однако priority_queue отличается от очереди тем, что следует некоторому алгоритму приоритета. Он может быть самым большим, от первого до последнего, или наименьшим, от первого до последнего. Критерии (алгоритм) также могут быть определены программистом.