Daily bit(e) C++. std::priority_queue

Добавлено 30 сентября 2023 в 09:04

Daily bit(e) C++ #234, адаптер контейнера упорядоченной очереди: std::priority_queue.

Daily bit(e) C++

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

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

#include <queue>
#include <iostream>
#include <iomanip>


std::priority_queue<int> queue;
// push() – операция O(logn)
queue.push(1);
queue.push(2);
queue.push(3);
queue.push(4);

// Печатает: 4 3 2 1
while (!queue.empty()) {
    // top() - это O(1)
    std::cout << queue.top() << " ";
    // pop() - это O(logn)
    queue.pop();
}
std::cout << "\n";

// Пример с пользовательским компаратором:
std::priority_queue<
    // Тип элемента
    std::string,
    // Базовый контейнер для использования
    std::vector<std::string>,
    // Пользовательский компаратор
    decltype([](const auto& left, const auto& right) {
        return left.length() > right.length();
    })> custom;

custom.push("a");
custom.push("aa");
custom.push("aaa");

// Печатает "a" "aa" "aaa"
while (!custom.empty()) {
    std::cout << std::quoted(custom.top()) << " ";
    custom.pop();
}
std::cout << "\n";

Открыть пример на Compiler Explorer.

Теги

C++ / CppDaily bit(e) C++STL / Standard Template Library / Стандартная библиотека шаблоновПрограммирование

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.