Spec-Zone.ru › C++

std::priority_queue

Определён в заголовочном файле <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 обычно приводит к ошибке, поскольку вычисление константного выражения требует освободить любое динамически выделенное хранилище в рамках того же вычисления, чего обычно не происходит при инициализации std::priority_queue.

(начиная с C++26)

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

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

Этим требованиям удовлетворяют стандартные контейнеры 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
(открытая функция-член)
(деструктор)
уничтожает priority_queue
(открытая функция-член)
operator=
присваивает значения адаптеру контейнера
(открытая функция-член)
Доступ к элементам
top
получает доступ к верхнему элементу
(открытая функция-член)
Ёмкость
empty
проверяет, пуст ли адаптер контейнера
(открытая функция-член)
size
возвращает количество элементов
(открытая функция-член)
Модификаторы
push
вставляет элемент и упорядочивает базовый контейнер
(открытая функция-член)
push_range
(C++23)
вставляет диапазон элементов и упорядочивает базовый контейнер
(открытая функция-член)
emplace
(C++11)
создаёт элемент на месте и упорядочивает базовый контейнер
(открытая функция-член)
pop
удаляет верхний элемент
(открытая функция-член)
swap
(C++11)
обменивает содержимое
(открытая функция-член)

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

std::swap(std::priority_queue)
(C++11)
специализирует алгоритм std::swap
(шаблон функции)

Вспомогательные классы

std::uses_allocator<std::priority_queue>
(C++11)
специализирует характеристику типа std::uses_allocator
(специализация шаблона класса)
std::formatter<std::priority_queue>
(C++23)
поддержка форматирования для std::priority_queue
(специализация шаблона класса)

Руководства по выводу типов

(начиная с C++17)

Примечания

Макрос проверки возможностей Значение Стандарт Возможность
__cpp_lib_containers_ranges 202202L (C++23) Конструирование и вставка в контейнеры с поддержкой диапазонов (Ranges-aware)
__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;

    // Fill the priority queue.
    for (int n : data)
        max_priority_queue.push(n);

    pop_println("max_priority_queue", max_priority_queue);

    // std::greater<int> makes the max priority queue act as a min priority queue.
    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);

    // Second way to define a min priority queue.
    std::priority_queue min_priority_queue2(data.begin(), data.end(), std::greater<int>());

    pop_println("min_priority_queue2", min_priority_queue2);

    // Using a custom function object to compare elements.
    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);

    // Using lambda to compare elements.
    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 принимает компаратор,
но для него не было определения типа-члена
добавлено

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/priority_queue

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API