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 похожа на управление кучей в некотором контейнере с произвольным доступом, но при этом случайная порча кучи невозможна.
| Все функции-члены Однако объявление переменной | (начиная с C++26) |
Параметры шаблона
| T | - | Тип хранимых элементов. Программа некорректна, если T не является тем же типом, что и Container::value_type. |
| Container | - | Тип базового контейнера для хранения элементов. Контейнер должен удовлетворять требованиям SequenceContainer, а его итераторы должны удовлетворять требованиям LegacyRandomAccessIterator. Кроме того, он должен предоставлять следующие функции с обычной семантикой:
Этим требованиям удовлетворяют стандартные контейнеры |
| Compare | - | Тип Compare, задающий строгое слабое упорядочение. Обратите внимание: параметр 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 (открытая функция-член) |
|
| присваивает значения адаптеру контейнера (открытая функция-член) |
|
Доступ к элементам |
|
| получает доступ к верхнему элементу (открытая функция-член) |
|
Ёмкость |
|
| проверяет, пуст ли адаптер контейнера (открытая функция-член) |
|
| возвращает количество элементов (открытая функция-член) |
|
Модификаторы |
|
| вставляет элемент и упорядочивает базовый контейнер (открытая функция-член) |
|
|
(C++23) | вставляет диапазон элементов и упорядочивает базовый контейнер (открытая функция-член) |
|
(C++11) | создаёт элемент на месте и упорядочивает базовый контейнер (открытая функция-член) |
| удаляет верхний элемент (открытая функция-член) |
|
|
(C++11) | обменивает содержимое (открытая функция-член) |
Функции, не являющиеся членами
|
(C++11) | специализирует алгоритм std::swap (шаблон функции) |
Вспомогательные классы
|
(C++11) | специализирует характеристику типа std::uses_allocator (специализация шаблона класса) |
|
(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 принимает компаратор,но для него не было определения типа-члена | добавлено |
См. также
| динамический массив с непрерывным хранением элементов (шаблон класса) |
|
| динамический битовый набор с эффективным использованием памяти (специализация шаблона класса) |
|
| двусторонняя очередь (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/priority_queue