Namespaces
Variants

std:: priority_queue

From cppreference.net
Определено в заголовочном файле <queue>
template <

class T,
class Container = std:: vector < T > ,
class Compare = std:: less < typename Container :: value_type >

> class priority_queue ;

Очередь с приоритетом — это адаптер контейнера , который обеспечивает постоянное время доступа к наибольшему (по умолчанию) элементу ценой логарифмического времени вставки и извлечения.

Пользовательская функция сравнения Compare может быть предоставлена для изменения порядка, например, использование std:: greater < T > приведет к тому, что наименьший элемент окажется на вершине через top() .

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

Все функции-члены std::priority_queue являются constexpr : возможно создавать и использовать объекты std::priority_queue при вычислении константного выражения.

Однако, объекты std::priority_queue обычно не могут быть constexpr , поскольку любая динамически выделенная память должна быть освобождена в том же вычислении константного выражения.

(since C++26)

Содержание

Параметры шаблона

T - Тип хранимых элементов. Программа некорректна, если T не совпадает с типом Container::value_type .
Container - Тип базового контейнера, используемого для хранения элементов. Контейнер должен удовлетворять требованиям SequenceContainer , и его итераторы должны удовлетворять требованиям LegacyRandomAccessIterator . Дополнительно он должен предоставлять следующие функции с обычной семантикой :

Стандартные контейнеры std::vector (не включая std::vector<bool> ) и std::deque удовлетворяют этим требованиям.

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)

Функции, не являющиеся членами класса

специализирует алгоритм 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 члена для него
добавлено

Смотрите также

изменяемый непрерывный массив
(шаблон класса)
эффективное по памяти динамическое битовое множество
(специализация шаблона класса)
двусторонняя очередь
(шаблон класса)