La
file de priorité
est un
adaptateur de conteneur
qui fournit une recherche en temps constant du plus grand élément (par défaut), au prix d'une insertion et d'une extraction logarithmiques.
Un
Compare
fourni par l'utilisateur peut être fourni pour modifier l'ordre, par exemple en utilisant
std::
greater
<
T
>
ferait apparaître le plus petit élément comme le
top()
.
Travailler avec une
priority_queue
est similaire à la gestion d'un
heap
dans un conteneur à accès aléatoire, avec l'avantage de ne pas pouvoir invalider accidentellement le heap.
Toutes les fonctions membres de
std::priority_queue
sont
constexpr
: il est possible de créer et d'utiliser des objets
std::priority_queue
lors de l'évaluation d'une expression constante.
Cependant, les objets
std::priority_queue
ne peuvent généralement pas être
constexpr
, car tout stockage alloué dynamiquement doit être libéré lors de la même évaluation d'expression constante.
Le type des éléments stockés. Le programme est mal formé si
T
n'est pas le même type que
Container::value_type
.
Container
-
Le type du conteneur sous-jacent utilisé pour stocker les éléments. Le conteneur doit satisfaire aux exigences de
SequenceContainer
, et ses itérateurs doivent satisfaire aux exigences de
LegacyRandomAccessIterator
. De plus, il doit fournir les fonctions suivantes avec la
sémantique habituelle
:
Un type
Compare
fournissant un ordre strict faible.
Notez que le paramètre
Compare
est défini de telle sorte qu'il retourne
true
si son premier argument vient
avant
son second argument dans un ordre faible. Mais comme la file de priorité sort les plus grands éléments en premier, les éléments qui "viennent avant" sont en réalité sortis en dernier. C'est-à-dire que l'avant de la file contient le "dernier" élément selon l'ordre faible imposé par
Compare
.
Types de membres
Membre
Définition
container_type
Container
value_compare
Compare
value_type
Container::value_type
size_type
Container::size_type
reference
Container::reference
const_reference
Container::const_reference
Objets membres
Membre
Description
Conteneur c
le conteneur sous-jacent (objet membre protégé)
Comparateur comp
l'objet fonction de comparaison (objet membre protégé)
#include <functional>#include <iostream>#include <queue>#include <string_view>#include <vector>template<typename T>void pop_println(std::string_view rem, T& pq){std::cout<< rem <<": ";for(;!pq.empty(); pq.pop())std::cout<< pq.top()<<' ';std::cout<<'\n';}template<typename T>void println(std::string_view rem, const T& v){std::cout<< rem <<": ";for(constauto& e : v)std::cout<< e <<' ';std::cout<<'\n';}int main(){constauto data ={1, 8, 5, 6, 3, 4, 0, 9, 7, 2};
println("data", data);
std::priority_queue<int> max_priority_queue;// Remplir la file de priorité.for(int n : data)
max_priority_queue.push(n);
pop_println("max_priority_queue", max_priority_queue);// std::greater<int> fait agir la file de priorité max comme une file de priorité min.
std::priority_queue<int, std::vector<int>, std::greater<int>>
min_priority_queue1(data.begin(), data.end());
pop_println("min_priority_queue1", min_priority_queue1);// Deuxième façon de définir une file de priorité min.
std::priority_queue min_priority_queue2(data.begin(), data.end(), std::greater<int>());
pop_println("min_priority_queue2", min_priority_queue2);// Utilisation d'un objet fonction personnalisé pour comparer les éléments.struct{bool operator()(constint l, constint r)const{return l > r;}} customLess;
std::priority_queue custom_priority_queue(data.begin(), data.end(), customLess);
pop_println("custom_priority_queue", custom_priority_queue);// Utilisation d'une lambda pour comparer les éléments.auto cmp =[](int left, int right){return(left ^1)<(right ^1);};
std::priority_queue<int, std::vector<int>, decltype(cmp)> lambda_priority_queue(cmp);for(int n : data)
lambda_priority_queue.push(n);
pop_println("lambda_priority_queue", lambda_priority_queue);}