std::priority_queue
Определено в заголовке <queue> | ||
|---|---|---|
template<
class T,
class Container = std::vector<T>,
class Compare = std::less<typename Container::value_type>
> class priority_queue;
|
Очередь с приоритетом — это адаптер контейнера, который обеспечивает постоное время доступа к наибольшему (по умолчанию) элементу, ценой логарифмического времени вставки и извлечения.
Может быть предоставлена пользовательская функция сравнения для изменения порядка, например, используя std::greater<T>, чтобы наименьший элемент отображался как top().
Работа с очередью с приоритетом похожа на управление кучей в контейнере с произвольным доступом, с тем преимуществом, что невозможно случайно нарушить структуру кучи.
Параметры шаблона
| T | - | Тип хранимых элементов. Поведение неопределено, если тип T не совпадает с типом Container::value_type. |
| Container | - | Тип базового контейнера для хранения элементов. Контейнер должен удовлетворять требованиям SequenceContainer, а его итераторы должны удовлетворять требованиям LegacyRandomAccessIterator. Кроме того, он должен предоставлять следующие функции со стандартной семантикой:
std::vector (включая std::vector<bool>) и std::deque удовлетворяют этим требованиям. |
| 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 | объект-функция сравнения (защищенный объект-член) |
Члены-функции
| создает очередь с приоритетом (публичная функция-член) |
|
| уничтожает очередь с приоритетом (публичная функция-член) |
|
| присваивает значения адаптеру контейнера (публичная функция-член) |
|
Доступ к элементам |
|
| получает элемент с наивысшим приоритетом (публичная функция-член) |
|
Вместимость |
|
| проверяет, пуста ли очередь с приоритетом (публичная функция-член) |
|
| возвращает количество элементов (публичная функция-член) |
|
Модификаторы |
|
| вставляет элемент и сортирует базовый контейнер (публичная функция-член) |
|
|
(C++23) | вставляет диапазон элементов и сортирует базовый контейнер (публичная функция-член) |
|
(C++11) | создает элемент на месте и сортирует базовый контейнер (публичная функция-член) |
| удаляет элемент с наивысшим приоритетом (публичная функция-член) |
|
|
(C++11) | обменивает содержимое (публичная функция-член) |
Функции вне класса
|
(C++11) | специализация алгоритма std::swap (шаблон функции) |
Вспомогательные классы
|
(C++11) | специализация типа-трейта std::uses_allocator (специализация шаблона класса) |
Выведение типов | (с C++17) |
Примечания
| Макрос проверки наличия функции | Значение | Std | Функция |
|---|---|---|---|
__cpp_lib_containers_ranges | 202202L | (C++23) | Совместимая с диапазонами конструкция и вставка для контейнеров |
Пример
#include <concepts>
#include <functional>
#include <iostream>
#include <queue>
#include <ranges>
#include <string_view>
#include <vector>
template<typename T>
void print(std::string_view name, T const& q)
{
std::cout << name << ": \t";
for (auto const& n : q)
std::cout << n << ' ';
std::cout << '\n';
}
template<typename Adaptor>
requires (std::ranges::input_range<typename Adaptor::container_type>)
void print(std::string_view name, const Adaptor& adaptor)
{
struct Printer : Adaptor // to access protected Adaptor::Container c;
{
void print(std::string_view name) const { ::print(name, this->c); }
};
static_cast<Printer const&>(adaptor).print(name);
}
int main()
{
const auto data = {1, 8, 5, 6, 3, 4, 0, 9, 7, 2};
print("data", data);
std::priority_queue<int> q1; // Max priority queue
for (int n : data)
q1.push(n);
print("q1", q1);
// Min 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>>
minq1(data.begin(), data.end());
print("minq1", minq1);
// Second way to define a min priority queue
std::priority_queue minq2(data.begin(), data.end(), std::greater<int>());
print("minq2", minq2);
// 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 minq3(data.begin(), data.end(), customLess);
print("minq3", minq3);
// 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)> q5(cmp);
for (int n : data)
q5.push(n);
print("q5", q5);
}Вывод:
data: 1 8 5 6 3 4 0 9 7 2 q1: 9 8 7 6 5 4 3 2 1 0 minq1: 0 1 2 3 4 5 6 7 8 9 minq2: 0 1 2 3 4 5 6 7 8 9 minq3: 0 1 2 3 4 5 6 7 8 9 q5: 8 9 6 7 4 5 2 3 0 1
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющих поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение, как опубликовано | Корректное поведение |
|---|---|---|---|
| LWG 307 | C++98 |
Container не мог быть std::vector<bool> | разрешено |
| LWG 2684 | C++98 |
priority_queue принимает компаратор, но не имел typedef для него | добавлен |
См. также
| динамический непрерывный массив (шаблон класса) |
|
| экономичный динамический битсет (специализация шаблона класса) |
|
| двусторонняя очередь (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/container/priority_queue