Qu'est-ce que la structure de données priority_queue ?
sobes.tech IA
Réponse de l'IA
priority_queue — un adaptador de contenedor de la biblioteca estándar de C++ que proporciona funcionalidad de cola de prioridad. Los elementos se extraen en orden de prioridad (por defecto, el elemento más grande tiene la mayor prioridad). Es, en esencia, un envoltorio sobre otro contenedor (por defecto std::vector) que utiliza algoritmos de montículo (std::make_heap, std::push_heap, std::pop_heap) para mantener la estructura de montículo dentro del contenedor base.
Características clave:
- Prioridad: Los elementos se extraen según su prioridad. Por defecto, se usa
std::lesspara determinar la prioridad, lo que significa que el elemento más grande se considera de mayor prioridad (montículo máximo). Se puede cambiar el orden proporcionando otro comparador, por ejemplo,std::greaterpara un montículo mínimo. - Adaptador:
priority_queueno es un contenedor independiente, sino que adapta otro contenedor base (generalmentestd::vector, pero puede ser otro, comostd::deque), proporcionando una interfaz de cola de prioridad. - Montículo: Internamente implementado usando un montículo, lo que garantiza una complejidad logarítmica para las operaciones de inserción y extracción.
- Acceso no ordenado: No proporciona acceso arbitrario a los elementos. Solo están disponibles las operaciones de inserción (
push), extracción del elemento con mayor prioridad (pop) y vista del elemento con mayor prioridad (top).
Operaciones principales:
| Operación | Descripción | Complejidad (promedio/peor caso) |
|---|---|---|
push |
Inserta un elemento con prioridad dada. | O(log N) |
pop |
Elimina el elemento con mayor prioridad. | O(log N) |
top |
Devuelve una referencia constante al elemento con mayor prioridad. | O(1) |
empty |
Verifica si la cola está vacía. | O(1) |
size |
Obtiene el número de elementos en la cola. | O(1) |
Ejemplo de uso:
#include <queue>
#include <vector>
#include <iostream>
#include <functional> // para std::greater
int main() {
// Montículo máximo (por defecto)
std::priority_queue<int> max_pq;
max_pq.push(10);
max_pq.push(30);
max_pq.push(20);
std::cout << "Elementos del montículo máximo (top): ";
while (!max_pq.empty()) {
std::cout << max_pq.top() << " ";
max_pq.pop();
}
std::cout << std::endl;
// Montículo mínimo (usando std::greater<int>)
std::priority_queue<int, std::vector<int>, std::greater<int>> min_pq;
min_pq.push(10);
min_pq.push(30);
min_pq.push(20);
std::cout << "Elementos del montículo mínimo (top): ";
while (!min_pq.empty()) {
std::cout << min_pq.top() << " ";
min_pq.pop();
}
std::cout << std::endl;
return 0;
}
Utilisé dans des algorithmes où il est nécessaire d'extraire constamment l'élément avec la priorité la plus élevée (ou la plus basse), comme l'algorithme de Dijkstra, l'algorithme de Prim ou dans des tâches de modélisation d'événements.