Junior
O que é a estrutura de dados priority_queue?
sobes.tech IA
Resposta da IA
priority_queue — um adaptador de contêiner da biblioteca padrão C++ que fornece funcionalidade de fila de prioridade. Os elementos são extraídos em ordem de prioridade (por padrão, o elemento de maior valor tem a maior prioridade). É, na essência, uma camada sobre outro contêiner (por padrão std::vector) que usa algoritmos de heap (std::make_heap, std::push_heap, std::pop_heap) para manter a estrutura de heap dentro do contêiner base.
Características principais:
- Prioridade: Os elementos são extraídos de acordo com sua prioridade. Por padrão, usa-se
std::lesspara determinar a prioridade, o que significa que o elemento maior é considerado de maior prioridade (heap máximo). Pode-se alterar a ordem fornecendo outro comparador, por exemplo,std::greaterpara um heap mínimo. - Adaptador:
priority_queuenão é um contêiner independente, mas adapta outro contêiner base (geralmentestd::vector, mas pode ser outro, comostd::deque), fornecendo uma interface de fila de prioridade. - Heap: Implementado internamente usando um heap, garantindo complexidade logarítmica para operações de inserção e extração.
- Acesso não ordenado: Não fornece acesso arbitrário aos elementos. Apenas as operações de inserção (
push), remoção do elemento de maior prioridade (pop) e visualização do elemento de maior prioridade (top) estão disponíveis.
Operações principais:
| Operação | Descrição | Complexidade (média/peor caso) |
|---|---|---|
push |
Insere um elemento com prioridade dada. | O(log N) |
pop |
Remove o elemento de maior prioridade. | O(log N) |
top |
Retorna uma referência constante ao elemento de maior prioridade. | O(1) |
empty |
Verifica se a fila está vazia. | O(1) |
size |
Obtém o número de elementos na fila. | O(1) |
Exemplo de uso:
#include <queue>
#include <vector>
#include <iostream>
#include <functional> // para std::greater
int main() {
// Heap máximo (padrão)
std::priority_queue<int> max_pq;
max_pq.push(10);
max_pq.push(30);
max_pq.push(20);
std::cout << "Elementos do heap máximo (top): ";
while (!max_pq.empty()) {
std::cout << max_pq.top() << " ";
max_pq.pop();
}
std::cout << std::endl;
// Heap 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 do heap mínimo (top): ";
while (!min_pq.empty()) {
std::cout << min_pq.top() << " ";
min_pq.pop();
}
std::cout << std::endl;
return 0;
}