C ++

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

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

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

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

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

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

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

  • Введение - см. Выше
  • Базовая конструкция
  • Важные функции-члены
  • Другие функции очереди приоритетов
  • Строковые данные
  • Другие конструкции приоритетной очереди
  • Заключение

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

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

priority_queue queueName;

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

priority_queue pq;

или же

priority_queue pq;

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

priority_queue, сравнить> pq;

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

priority_queue, меньше > pq;

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

priority_queue > pq;

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

priority_queue, больше > pq;

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

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

priority_queue pq;
pq.толкать (10);
pq.толкать (30);
pq.толкать (20);
pq.толкать (50);
pq.толкать (40);

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

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

priority_queue, больше > pq;
pq.push ('а'); pq.push ('c'); pq.push ('b'); pq.push ('е'); pq.push ('д');

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

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

priority_queue, больше > pq;
pq.push ('а'); pq.push ('c'); pq.push ('b'); pq.push ('е'); pq.push ('д');
char ch1 = pq.вершина(); pq.pop ();
символ ch2 = pq.вершина(); pq.pop ();
символ ch3 = pq.вершина(); pq.pop ();
символ ch4 = pq.вершина(); pq.pop ();
символ ch5 = pq.вершина(); pq.pop ();
cout<На выходе получается 'a "b" c "d" e'.

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

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

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

priority_queue pq;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.push (i1); pq.push (i2); pq.push (i3); pq.push (i4); pq.нажать (i5);
пока(!pq.пустой())

cout << pq.top() << ";
pq.pop ();

cout << '\n';

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

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

priority_queue pq;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.push (i1); pq.push (i2); pq.push (i3); pq.push (i4); pq.нажать (i5);
int len ​​= pq.размер();
cout << len << '\n';

Выход 5.

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

priority_queue pq1;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq1.push (i1); pq1.push (i2); pq1.push (i3); pq1.push (i4); pq1.нажать (i5);
priority_queue pqA;
int it1 = 1; int it2 = 3; int it3 = 2; int it4 = 5; int it5 = 4;
pqA.push (it1); pqA.push (it2); pqA.толкнуть (it3); pqA.толкнуть (it4); pqA.толкать (it5);
pq1.своп (pqA);
пока(!pq1.пустой())

cout << pq1.top() << ";
pq1.pop ();
cout<<'\n';
пока(!pqA.пустой())

cout << pqA.top() << ";
pqA.pop ();
cout<<'\n';

Результат:

5 4 3 2 1
50 40 30 20 10

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

priority_queue pq1;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq1.emplace (i1); pq1.место (i2); pq1.место (i3); pq1.место (i4); pq1.поставить (i5);
пока(!pq1.пустой())

cout << pq1.top() << ";
pq1.pop ();
cout<<'\n';

Результат:

50 40 30 20 10

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

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

#включать
priority_queue pq1;
строка s1 = строка ("ручка"), s2 = строка ("карандаш"), s3 = строка ("тетрадь"), s4 = строка ("учебник"), s5 = строка ("линейка");
pq1.нажать (s1); pq1.нажать (s2); pq1.нажать (s3); pq1.нажать (s4); pq1.нажать (s5);
пока(!pq1.пустой())

cout << pq1.top() << " ";
pq1.pop ();
cout<<'\n';

Результат:

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

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

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

#включать
вектор vtr = 10, 30, 20, 50, 40;
priority_queue pq (vtr.begin (), vtr.конец());
пока(!pq.пустой())

cout << pq.top() << ";
pq.pop ();
cout<<'\n';

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

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

priority_queue, больше> int>> pq (vtr.begin (), vtr.конец());

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

int arr [] = 10, 30, 20, 50, 40;
priority_queue pq (обр., обр. + 5);
пока(!pq.пустой())

cout << pq.top() << ";
pq.pop ();
cout<<'\n';

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

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

priority_queue, больше > 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 отличается от очереди тем, что следует некоторому алгоритму приоритета. Он может быть наибольшим, от первого до последнего, или наименьшим, от первого до последнего. Критерии (алгоритм) также могут быть определены программистом.

Лучшие дистрибутивы Linux для игр в 2021 году
Операционная система Linux прошла долгий путь от своего первоначального простого серверного вида. Эта ОС значительно улучшилась за последние годы и те...
Как записать и транслировать игровую сессию в Linux
В прошлом игры считались только хобби, но со временем игровая индустрия увидела огромный рост с точки зрения технологий и количества игроков. Игровая ...
Лучшие игры с отслеживанием рук
Oculus Quest недавно представил отличную идею отслеживания рук без контроллеров. С постоянно растущим числом игр и действий, которые осуществляются фо...