Чтобы использовать C ++ priority_queue, программа должна начинаться с такого кода:
#включать#включать
используя пространство имен std;
Включает библиотеку очередей в программу.
Чтобы продолжить чтение, читатель должен иметь базовые знания языка Си++.
Содержание статьи
- Введение - см. Выше
- Базовая конструкция
- Важные функции-члены
- Другие функции очереди приоритетов
- Строковые данные
- Другие конструкции приоритетной очереди
- Заключение
Базовая конструкция
Прежде чем использовать структуру данных, она должна быть построена. Конструкция здесь означает создание экземпляра объекта из класса очереди библиотеки. Затем объект очереди должен иметь имя, данное ему программистом. Самый простой синтаксис для создания очереди с приоритетом:
priority_queueПри таком синтаксисе сначала удаляется наибольшее значение. Пример создания:
priority_queueили же
priority_queueВектор и двухсторонняя очередь - это две структуры данных в C++. Priority_queue может быть создан с любым из них. Синтаксис для создания очереди приоритетов из векторной структуры:
priority_queueПример этого экземпляра:
priority_queueОбратите внимание на разрыв между> и> в конце объявления. Это сделано для предотвращения путаницы с >>. Код сравнения по умолчанию - «меньше
Если сначала нужно удалить наименьшее значение, тогда инструкция должна быть:
priority_queueВажные функции-члены
Функция push ()
Эта функция помещает значение, являющееся ее аргументом, в очередь priority_queue. Он возвращает недействительность. Следующий код иллюстрирует это:
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 значение с наивысшим приоритетом. Если код сравнения «больше»
pq.push ('а'); pq.push ('c'); pq.push ('b'); pq.push ('е'); pq.push ('д');
Обратите внимание, что для вызова функции-члена после имени объекта должна быть поставлена точка, а затем функция.
Функция top ()
В поп () функция удаляет следующее значение с наивысшим приоритетом, но не возвращает его, поскольку поп () это пустая функция. Использовать вершина() функция, чтобы узнать значение наивысшего приоритета, которое необходимо удалить в следующий раз. В вершина() функция возвращает копию значения наивысшего приоритета в priority_queue. Следующий код, где следующее значение с наивысшим приоритетом - это наименьшее значение, иллюстрирует это
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<
Функция empty ()
Если программист использует вершина() в пустой очереди priority_queue, после успешной компиляции он получит сообщение об ошибке, например:
Поэтому всегда проверяйте, не пуста ли очередь приоритетов, прежде чем использовать вершина() функция. В пустой() функция-член возвращает логическое значение true, если очередь пуста, и false, если очередь не пуста. Следующий код иллюстрирует это:
priority_queueint 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 ()
Эта функция возвращает длину очереди приоритетов, как показано в следующем коде:
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 имеют одинаковый тип и размер, то они могут быть заменены этой функцией, как показано в следующем коде:
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
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. Следующий код иллюстрирует это:
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
строка s1 = строка ("ручка"), s2 = строка ("карандаш"), s3 = строка ("тетрадь"), s4 = строка ("учебник"), s5 = строка ("линейка");
pq1.нажать (s1); pq1.нажать (s2); pq1.нажать (s3); pq1.нажать (s4); pq1.нажать (s5);
пока(!pq1.пустой())
cout << pq1.top() << " ";
pq1.pop ();
cout<<'\n';
Результат:
учебник линейка карандаш ручка тетрадь
Другие конструкции приоритетной очереди
Явное создание из вектора
Очередь с приоритетом может быть создана явно из вектора, как показано в следующем коде:
вектор
priority_queue
пока(!pq.пустой())
cout << pq.top() << ";
pq.pop ();
cout<<'\n';
Вывод: 50 40 30 20 10. На этот раз также должен быть включен векторный заголовок. Аргументы функции-конструктора принимают указатели начала и конца вектора. Тип данных для вектора и тип данных для priority_queue должны быть одинаковыми.
Чтобы сделать наименьшее значение приоритетом, объявление конструктора будет следующим:
priority_queueЯвное создание из массива
Очередь с приоритетом может быть создана явно из массива, как показано в следующем коде:
priority_queue
пока(!pq.пустой())
cout << pq.top() << ";
pq.pop ();
cout<<'\n';
Вывод: 50 40 30 20 10. Аргументы функции-конструктора принимают указатели начала и конца массива. arr возвращает начальный указатель, «arr + 5» возвращает указатель сразу за массивом, а 5 - это размер массива. Тип данных для массива и тип данных для priority_queue должны быть одинаковыми.
Чтобы сделать наименьшее значение приоритетом, объявление конструктора будет следующим:
priority_queueПримечание. В 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 отличается от очереди тем, что следует некоторому алгоритму приоритета. Он может быть наибольшим, от первого до последнего, или наименьшим, от первого до последнего. Критерии (алгоритм) также могут быть определены программистом.