La classe deque en C++ ( Bibliothèque STL)

08 Feb 2022 08 Feb 2022 3984 vues ESSADDOUKI Mostafa 6 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

Une deque (double ended queue — file à deux bouts) est un conteneur de séquence qui permet l'expansion et la contraction aux deux extrémités. Définie dans l'en-tête <deque>, elle est similaire à vector mais avec des insertions et suppressions efficaces en tête et en queue.

Mémoire non contiguë Contrairement à vector, la deque ne garantit pas une allocation mémoire contiguë. Cela lui permet de s'étendre aux deux extrémités sans recopier tout le contenu, mais la rend moins efficace que vector lorsqu'on n'a pas besoin d'insertions en tête.
Opérationvectordeque
Insertion/suppression en finO(1) amortiO(1) amorti
Insertion/suppression en têteO(n)O(1) amorti
Insertion/suppression au milieuO(n)O(n)
Accès aléatoireO(1)O(1)
Mémoire contiguëOuiNon garantie

Construction

   
Constructeurs C++
deque<T> deq;                    // Conteneur vide
deque<T> deq(n, valeur);         // n copies de valeur
deque<T> deq(debut, fin);        // Copie de la plage [debut, fin)
deque<T> deq(autreDeque);        // Copie d'une autre deque
deque<T> deq = autreDeque;       // Opérateur d'affectation

Insertion

   
Fonctions d'insertion C++
deq.push_back(val);                        // Ajouter en fin
deq.push_front(val);                       // Ajouter en tête

// insert — retourne un itérateur vers le 1er élément inséré
deq.insert(position, val);                 // 1 élément avant position
deq.insert(position, n, val);             // n copies de val
deq.insert(position, premier, dernier);   // plage [premier, dernier)
deq.insert(position, liste);              // liste d'initialisation

Taille

   
Fonctions de taille C++
deq.size();            // Taille actuelle
deq.max_size();        // Taille maximale supportée
deq.resize(n, val);    // Redimensionner (val optionnel pour les nouveaux éléments)
deq.empty();           // true si vide

Accès aux éléments

   
Fonctions d'accès C++
deq.front();   // Premier élément
deq.back();    // Dernier élément
deq[i];        // Élément à l'indice i (sans vérification des bornes)
deq.at(i);     // Élément à l'indice i (avec vérification — lève une exception)

Suppression

   
Fonctions de suppression C++
deq.pop_back();                  // Supprimer le dernier élément
deq.pop_front();                 // Supprimer le premier élément
deq.erase(pos);                  // Supprimer l'élément pointé par pos
deq.erase(premier, dernier);     // Supprimer la plage [premier, dernier)
deq.clear();                     // Supprimer tous les éléments
Arguments itérateurs Les arguments premier et dernier dans erase et insert sont des itérateurs. La borne dernier est toujours exclue de la plage traitée.

Exemple complet

#include <iostream>
#include <string>
#include <deque>
using namespace std;

void afficher(deque<string> deq) {
    for (int i = 0; i < deq.size(); i++)
        cout << deq.at(i) << " ";
    cout << endl;
}

int main() {
    deque<string> etd;

    etd.push_back("Mostafa");
    etd.push_back("Omar");
    etd.push_back("Sara");
    etd.push_back("Mohamed");
    etd.push_back("Moneim");
    etd.push_front("Alex");           // insère en tête

    cout << "Taille : " << etd.size() << endl;
    cout << "Taille max : " << etd.max_size() << endl;

    cout << "Liste des étudiants : " << endl;
    afficher(etd);
    cout << '\n';

    // Insertion à la position it+2
    deque<string>::iterator it = etd.begin();
    etd.insert(it + 2, "Dounia");

    cout << "Après insertion de Dounia : " << endl;
    afficher(etd);
    cout << '\n';

    cout << "Premier élément : " << etd.front() << endl;
    cout << "Dernier élément : " << etd.back()  << endl;
    cout << "3ème élément    : " << etd.at(2)   << endl;
    cout << '\n';

    etd.pop_front();
    etd.pop_back();
    cout << "Après suppression du premier et dernier : " << endl;
    afficher(etd);
    cout << '\n';

    it = etd.begin();
    deque<string>::iterator premier = it + 1;   // Omar
    deque<string>::iterator dernier = it + 3;   // Sara (exclu)
    etd.erase(premier, dernier);

    cout << "Après suppression entre Omar et Sara : " << endl;
    afficher(etd);

    return 0;
}
Sortie
Taille : 6
Taille max : 288230376151711743
Liste des étudiants :
Alex Mostafa Omar Sara Mohamed Moneim

Après insertion de Dounia :
Alex Mostafa Dounia Omar Sara Mohamed Moneim

Premier élément : Alex
Dernier élément : Moneim
3ème élément    : Dounia

Après suppression du premier et dernier :
Mostafa Dounia Omar Sara Mohamed

Après suppression entre Omar et Sara :
Mostafa Sara Mohamed

Application — Rotation de liste

La deque est naturellement adaptée à la rotation : faire avancer ou reculer cycliquement tous les éléments d'une position.

Principe de la rotation
  • Rotation horaire (vers l'arrière) : retirer l'élément de tête et l'insérer en queue — push_back(front()) puis pop_front().
  • Rotation anti-horaire (vers l'avant) : retirer l'élément de queue et l'insérer en tête — push_front(back()) puis pop_back().
#include <iostream>
#include <string>
#include <deque>
using namespace std;

void afficher(deque<string> deq) {
    for (int i = 0; i < deq.size(); i++)
        cout << deq.at(i) << " ";
    cout << endl;
}

int main() {
    deque<string> etd;
    etd.push_back("Mostafa");
    etd.push_back("Omar");
    etd.push_back("Sara");
    etd.push_back("Mohamed");
    etd.push_back("Moneim");
    etd.push_front("Alex");

    cout << "Liste initiale : " << endl;
    afficher(etd);
    cout << '\n';

    // Rotation horaire (tête → queue)
    etd.push_back(etd.front());
    etd.pop_front();
    cout << "Après rotation horaire : " << endl;
    afficher(etd);
    cout << '\n';

    // Rotation anti-horaire (queue → tête)
    etd.push_front(etd.back());
    etd.pop_back();
    cout << "Après rotation anti-horaire : " << endl;
    afficher(etd);

    return 0;
}
Sortie
Liste initiale :
Alex Mostafa Omar Sara Mohamed Moneim

Après rotation horaire :
Mostafa Omar Sara Mohamed Moneim Alex

Après rotation anti-horaire :
Alex Mostafa Omar Sara Mohamed Moneim

Discussion (0)

Soyez le premier à laisser un commentaire !

Laisser un commentaire

Votre commentaire sera visible après modération.