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;

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

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

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

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

T - Тип хранимых элементов. Поведение неопределено, если тип T не совпадает с типом Container::value_type.
Container - Тип базового контейнера для хранения элементов. Контейнер должен удовлетворять требованиям SequenceContainer, а его итераторы должны удовлетворять требованиям LegacyRandomAccessIterator. Кроме того, он должен предоставлять следующие функции со стандартной семантикой:
  • front()
  • push_back()
  • 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
объект-функция сравнения
(защищенный объект-член)

Члены-функции

(конструктор)
создает очередь с приоритетом
(публичная функция-член)
(деструктор)
уничтожает очередь с приоритетом
(публичная функция-член)
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
(специализация шаблона класса)

Выведение типов

(с 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 для него добавлен

См. также

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

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

Spec-Zone.ru

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