La file d'attente prioritaire (classe priority_queue) - Bibliothèque STL

10 Feb 2022 10 Feb 2022 2554 vues ESSADDOUKI Mostafa 5 min de lecture
Introduction et syntaxe de base
1 Introduction au langage C++ 2 Entrée-sortie en C++ - cin et cout 3 Inférence de type avec le mot-clé auto en C++ 4 Classe std::string et les chaînes de caractères en C++ 5 Les structures conditionnelles (if et switch) en C++ (C++17 et C++20) 6 Les boucles en C++ (C++17 et C++20) 7 La gestion des fichiers en C++
Pointeurs et fonctions
8 Introduction aux pointeurs en C++ - Déclaration et interêts 9 Les références en C++ - déclaration et interêts 10 Les tableaux en C++ - Déclaration et interêts 11 Introduction aux fonctions en C++ 12 Passer des arguments à une fonction en C++ 13 Déclarer un paramètre const en C++ 14 Les fonctions Lambda en C++ 15 Fonctions utiles (Mathématiques et caractères) en C++
Programmation OO
16 Classes et objets en C++ 17 Spécificateurs d'accès en C++ 18 Constructeurs et destructeur d'une classe en C++ 19 Fonctions membres en C++ 20 Membres statiques d'une classe en C++ 21 Fonctions en ligne en C++ - inline 22 Fonctions et classes amies en C++ - friend 23 Surcharge des fonctions en C++ 24 Surcharge des opérateurs en C++ 25 Héritage en C++ 26 La gestion d'exceptions en C++ : déclaration, utilisation et personnalisation 27 fonctions et classes templates en C++ 28 Les nouveautés C++20 pour améliorer les templates en C++
Structures de données
29 Introduction aux structures de données 30 Les structures en C++ et la différence avec les structures en C 31 Les listes chaînées en C++ 32 Les piles en C++ 33 File d'attente en C++ 34 Arbre binaire de recherche : définition et mise en oeuvre en C++
La bibliothèque standard (STL)
35 Introduction à la bibliothèque de Template Standard STL 36 Les itérateurs en C++ - définition, déclaration et exemples 37 La classe array en C++ (bibliothèque STL) <array> 38 La classe vector de la bibliothèque STL <vector> 39 La classe deque en C++ ( Bibliothèque STL) 40 La classe list en C++ (bibliothèque STL) <list> 41 La classe stack (Pile) en C++ (bibliothèque STL) <stack> 42 La classe queue (File d'attente) en C++ (bibliothèque STL) <queue> 43 La file d'attente prioritaire (classe priority_queue) - Bibliothèque STL 44 Les ensembles en C++ (Classe set <set> - Bibliothèque STL) 45 Les dictionnaires en C++ : Classe map (Bibliothèque STL) 46 Introduction aux algorithmes de la bibliothèque STL (programmation compétitive) 47 Tri et méthodes associées en C++ - Bibliothèque STL 48 Recherche dichotomique et méthodes associées en C++ - Bibliothèque STL 49 Appliquer un prédicat ou une fonction aux éléments d'une séquence en C++ - Bibliothèque STL 50 Recherche dans une séquence et méthodes associées en C++ - Bibliothèque STL

La file d'attente prioritaire (priority_queue)

Une file d'attente prioritaire est une extension de la file d'attente dans laquelle chaque élément possède une priorité. Les éléments sont retirés non pas dans l'ordre d'insertion, mais selon leur niveau de priorité : l'élément de plus haute priorité est toujours retiré en premier.

Propriétés
  • Chaque élément est associé à une priorité.
  • Un élément de haute priorité est retiré avant un élément de faible priorité.
  • Si deux éléments ont la même priorité, ils sont servis dans leur ordre d'insertion.

Types de file prioritaire

TypePrincipeÉlément retiré en premier
Ordre décroissant (tas max)La valeur la plus grande a la priorité la plus hauteLe plus grand élément
Ordre croissant (tas min)La valeur la plus petite a la priorité la plus hauteLe plus petit élément

Implémentations possibles

Une file de priorité peut être implémentée via un tableau, une liste chaînée, une structure de tas (heap) ou un arbre binaire de recherche. La STL utilise un tas binaire, ce qui garantit des insertions et suppressions en O(log n).

Applications

Les files de priorité interviennent dans de nombreux algorithmes et systèmes : algorithme de Dijkstra (plus court chemin), algorithme de Prim (arbre couvrant minimal), tri par tas (heapsort), compression de Huffman, et ordonnancement de processus dans les systèmes d'exploitation (gestion des interruptions, équilibrage de charge).

La classe priority_queue STL

Définie dans <queue>, la classe priority_queue est un adaptateur de conteneur implémenté comme un tas maximum par défaut : le sommet (top()) est toujours l'élément de plus grande valeur.

   
Déclaration C++
#include <queue>

priority_queue<type_objets> nomFPri;   // Tas max par défaut

// Tas minimum : inverser le comparateur
priority_queue<int, vector<int>, greater<int>> tasMin;

Opérations

FonctionDescription
bool empty()Retourne true si la file est vide.
size_type size()Renvoie le nombre d'éléments.
reference top()Renvoie une référence à l'élément de plus haute priorité (le plus grand par défaut).
void push(val)Insère val en maintenant l'invariant du tas.
void pop()Supprime l'élément au sommet — réduit la taille de 1.
Accès limité au sommet Contrairement à queue, la priority_queue ne donne accès qu'au sommet via top(). Il n'est pas possible d'accéder à l'arrière (back()) ni d'utiliser des itérateurs.

Exemple 1 — Types primitifs (tas max)

#include <iostream>
#include <queue>
using namespace std;

int main() {
    priority_queue<int> pq;
    pq.push(4); pq.push(7); pq.push(2);
    pq.push(6); pq.push(9); pq.push(8); pq.push(2);

    cout << "Sommet : " << pq.top()  << '\n';
    cout << "Taille : " << pq.size() << '\n';

    pq.pop();  // Supprimer 9 (le plus grand)

    cout << "Éléments après suppression du sommet 9 : ";
    while (!pq.empty()) {
        cout << pq.top() << ' ';
        pq.pop();
    }
    cout << '\n';
    return 0;
}
Sortie
Sommet : 9
Taille : 7
Éléments après suppression du sommet 9 : 8 7 6 4 2 2

Exemple 2 — Types personnalisés avec opérateur de comparaison

Pour utiliser priority_queue avec des objets, il faut définir l'opérateur < afin que la STL puisse comparer les éléments et maintenir l'invariant du tas.

Tas max vs tas min avec des objets Si operator< compare les priorités dans l'ordre naturel (p1.priorite < p2.priorite), on obtient un tas max (plus haute priorité au sommet). Pour un tas min, inverser la comparaison en utilisant >.
#include <iostream>
#include <queue>
using namespace std;

class Processus {
    int id, priorite;
public:
    Processus(int id, int p) : id(id), priorite(p) {}
    void afficher() const {
        cout << "Id=" << id << "  priorité=" << priorite << '\n';
    }
    int getPriorite() const { return priorite; }
};

// Opérateur < pour tas maximum (grande priorité = sommet)
bool operator<(const Processus& p1, const Processus& p2) {
    return p1.getPriorite() < p2.getPriorite();
}

int main() {
    priority_queue<Processus> pq;
    pq.push(Processus(2,  8));
    pq.push(Processus(10, 4));
    pq.push(Processus(15,18));
    pq.push(Processus(30, 2));
    pq.push(Processus(40, 5));

    cout << "Sommet : ";
    pq.top().afficher();

    cout << "\nÉléments dans l'ordre de priorité :\n";
    while (!pq.empty()) {
        pq.top().afficher();
        pq.pop();
    }
    return 0;
}
Sortie
Sommet : Id=15  priorité=18

Éléments dans l'ordre de priorité :
Id=15  priorité=18
Id=2   priorité=8
Id=40  priorité=5
Id=10  priorité=4
Id=30  priorité=2
Critèrestackqueuepriority_queue
PrincipeLIFOFIFOPriorité (tas max par défaut)
Accèstop()front() / back()top() uniquement
InsertionSommetArrièreMaintien invariant tas
SuppressionSommetAvantSommet (plus haute priorité)
ItérateursNonNonNon
Conteneur par défautdequedequevector

Discussion (0)

Soyez le premier à laisser un commentaire !

Laisser un commentaire

Votre commentaire sera visible après modération.