Priority_queue что это за структура данных
`std::priority_queue` — это контейнер-адаптер в C++, который предоставляет функциональность приоритетной очереди. Приоритетная очередь — это структура данных, которая позволяет вставлять элементы и извлекать элемент с наивысшим приоритетом. В случае `std::priority_queue`, элемент с наивысшим приоритетом — это элемент с наибольшим значением по умолчанию, что означает, что это очередь с максимальным приоритетом.
Основные характеристики:
1. Автоматическая сортировка: Элементы внутри приоритетной очереди автоматически сортируются таким образом, что элемент с наивысшим приоритетом всегда находится на вершине.
2. Доступ только к элементу с наивысшим приоритетом: Вы можете получить доступ только к элементу с наивысшим приоритетом (то есть к самому большому элементу, если не указано иное).
3. Основана на куче (heap): Реализация `std::priority_queue` основана на двоичной куче, что обеспечивает эффективное выполнение основных операций.
Основные операции:
- push(value): Вставляет элемент в приоритетную очередь.
- pop(): Удаляет элемент с наивысшим приоритетом.
- top(): Возвращает ссылку на элемент с наивысшим приоритетом.
- empty(): Проверяет, пуста ли приоритетная очередь.
- size(): Возвращает количество элементов в приоритетной очереди.
Пример использования:
```cpp
#include <iostream>
#include <queue>
#include <vector>
int main() {
std::priority_queue<int> pq;
pq.push(10);
pq.push(20);
pq.push(5);
pq.push(15);
std::cout << "Top element (should be 20): " << pq.top() << std::endl;
pq.pop(); // Удаляет элемент 20
std::cout << "Top element after pop (should be 15): " << pq.top() << std::endl;
while (!pq.empty()) {
std::cout << pq.top() << " ";
pq.pop();
}
return 0;
}
```
Объяснение кода:
1. Создание приоритетной очереди: `std::priority_queue<int> pq;` создаёт приоритетную очередь для целых чисел.
2. Вставка элементов: Вставляются элементы 10, 20, 5 и 15.
3. Получение и удаление элемента с наивысшим приоритетом:
- `pq.top()` возвращает элемент 20, так как он имеет наивысший приоритет.
- `pq.pop()` удаляет элемент 20.
- Следующий вызов `pq.top()` возвращает элемент 15.
4. Вывод всех элементов: В цикле выводятся и удаляются все элементы, начиная с самого большого.
Кастомизация приоритетной очереди:
По умолчанию, `std::priority_queue` работает как максимальная куча. Можно изменить её поведение на минимальную кучу, передав компаратор. Например, используя `std::greater`:
```cpp
#include <iostream>
#include <queue>
#include <vector>
int main() {
std::priority_queue<int, std::vector<int>, std::greater<int>> minHeap;
minHeap.push(10);
minHeap.push(20);
minHeap.push(5);
minHeap.push(15);
std::cout << "Top element (should be 5): " << minHeap.top() << std::endl;
while (!minHeap.empty()) {
std::cout << minHeap.top() << " ";
minHeap.pop();
}
return 0;
}
```
`std::priority_queue` — это структура данных, которая позволяет эффективно вставлять элементы и извлекать элемент с наивысшим приоритетом, используя внутреннюю реализацию на основе кучи. По умолчанию элементы сортируются в порядке убывания, но можно изменить поведение с помощью пользовательского компаратора.
May 24, 2024, easyoffer