std:: priority_queue
|
Определено в заголовочном файле
<queue>
|
||
|
template
<
class
T,
|
||
Очередь с приоритетом — это адаптер контейнера , который обеспечивает постоянное время доступа к наибольшему (по умолчанию) элементу ценой логарифмического времени вставки и извлечения.
Пользовательская функция сравнения
Compare
может быть предоставлена для изменения порядка, например, использование
std::
greater
<
T
>
приведет к тому, что наименьший элемент окажется на вершине через
top()
.
Работа с
priority_queue
аналогична управлению
кучей
в некотором контейнере с произвольным доступом, с тем преимуществом, что нельзя случайно нарушить структуру кучи.
Все функции-члены
std::priority_queue
являются
constexpr
: возможно создавать и использовать объекты
std::priority_queue
при вычислении константного выражения.
Однако, объекты
|
(since C++26) |
Содержание |
Параметры шаблона
| T | - |
Тип хранимых элементов. Программа некорректна, если
T
не совпадает с типом
Container::value_type
.
|
| Container | - |
Тип базового контейнера, используемого для хранения элементов. Контейнер должен удовлетворять требованиям
SequenceContainer
, и его итераторы должны удовлетворять требованиям
LegacyRandomAccessIterator
. Дополнительно он должен предоставлять следующие функции с
обычной семантикой
:
Стандартные контейнеры
std::vector
(не включая
|
| Compare | - |
Тип
Compare
, предоставляющий строгое слабое упорядочение.
Обратите внимание, что параметр Compare определён таким образом, что он возвращает true , если его первый аргумент находится перед вторым аргументом в слабом упорядочении. Но поскольку очередь с приоритетом выводит наибольшие элементы первыми, элементы, которые "находятся перед", фактически выводятся последними. То есть начало очереди содержит "последний" элемент согласно слабому упорядочению, заданному Compare . |
Типы членов
| Тип члена | Определение |
container_type
|
Container
|
value_compare
|
Compare
|
value_type
|
Container::value_type
|
size_type
|
Container :: size_type |
reference
|
Container::reference
|
const_reference
|
Container::const_reference
|
Объекты-члены
| Название члена | Определение |
|
Container
c
|
базовый контейнер
(защищённый член-объект) |
|
Compare
comp
|
функциональный объект сравнения
(защищённый член-объект) |
Функции-члены
конструирует
priority_queue
(public member function) |
|
уничтожает
priority_queue
(public member function) |
|
|
присваивает значения адаптеру контейнера
(public member function) |
|
Доступ к элементам |
|
|
доступ к верхнему элементу
(public member function) |
|
Вместимость |
|
|
проверяет, пуст ли адаптер контейнера
(public member function) |
|
|
возвращает количество элементов
(public member function) |
|
Модификаторы |
|
|
вставляет элемент и сортирует базовый контейнер
(public member function) |
|
|
(C++23)
|
вставляет диапазон элементов и сортирует базовый контейнер
(public member function) |
|
(C++11)
|
создаёт элемент на месте и сортирует базовый контейнер
(public member function) |
|
удаляет верхний элемент
(public member function) |
|
|
(C++11)
|
обменивает содержимое
(public member function) |
Функции, не являющиеся членами класса
|
(C++11)
|
специализирует алгоритм
std::swap
(шаблон функции) |
Вспомогательные классы
|
специализирует
std::uses_allocator
type trait
(специализация шаблона класса) |
|
поддержка форматирования для
std::priority_queue
(специализация шаблона класса) |
Руководства по выводу |
(начиная с C++17) |
Примечания
| Макрос тестирования возможностей | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_containers_ranges
|
202202L
|
(C++23) | Ориентированная на диапазоны конструкция и вставка для контейнеров |
__cpp_lib_constexpr_queue
|
202502L
|
(C++26) |
constexpr
std::priority_queue
|
Пример
#include <functional> #include <iostream> #include <queue> #include <string_view> #include <vector> template<typename T> void pop_println(std::string_view rem, T& pq) { std::cout << rem << ": "; for (; !pq.empty(); pq.pop()) std::cout << pq.top() << ' '; std::cout << '\n'; } template<typename T> void println(std::string_view rem, const T& v) { std::cout << rem << ": "; for (const auto& e : v) std::cout << e << ' '; std::cout << '\n'; } int main() { const auto data = {1, 8, 5, 6, 3, 4, 0, 9, 7, 2}; println("data", data); std::priority_queue<int> max_priority_queue; // Заполнение очереди с приоритетом. for (int n : data) max_priority_queue.push(n); pop_println("max_priority_queue", max_priority_queue); // std::greater<int> заставляет очередь с максимальным приоритетом вести себя как очередь с минимальным приоритетом. std::priority_queue<int, std::vector<int>, std::greater<int>> min_priority_queue1(data.begin(), data.end()); pop_println("min_priority_queue1", min_priority_queue1); // Второй способ определения очереди с минимальным приоритетом. std::priority_queue min_priority_queue2(data.begin(), data.end(), std::greater<int>()); pop_println("min_priority_queue2", min_priority_queue2); // Использование пользовательского функционального объекта для сравнения элементов. struct { bool operator()(const int l, const int r) const { return l > r; } } customLess; std::priority_queue custom_priority_queue(data.begin(), data.end(), customLess); pop_println("custom_priority_queue", custom_priority_queue); // Использование лямбды для сравнения элементов. auto cmp = [](int left, int right) { return (left ^ 1) < (right ^ 1); }; std::priority_queue<int, std::vector<int>, decltype(cmp)> lambda_priority_queue(cmp); for (int n : data) lambda_priority_queue.push(n); pop_println("lambda_priority_queue", lambda_priority_queue); }
Вывод:
data: 1 8 5 6 3 4 0 9 7 2 max_priority_queue: 9 8 7 6 5 4 3 2 1 0 min_priority_queue1: 0 1 2 3 4 5 6 7 8 9 min_priority_queue2: 0 1 2 3 4 5 6 7 8 9 custom_priority_queue: 0 1 2 3 4 5 6 7 8 9 lambda_priority_queue: 8 9 6 7 4 5 2 3 0 1
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| LWG 307 | C++98 |
Container
не мог быть
std::vector<bool>
|
разрешено |
| LWG 2566 | C++98 |
Отсутствовало требование для
Container::value_type
|
некорректная форма, если
T
не совпадает с типом
Container::value_type
|
| LWG 2684 | C++98 |
priority_queue
принимает компаратор
но не имел typedef члена для него |
добавлено |
Смотрите также
|
изменяемый непрерывный массив
(шаблон класса) |
|
|
эффективное по памяти динамическое битовое множество
(специализация шаблона класса) |
|
|
двусторонняя очередь
(шаблон класса) |