Utiliser le conteneur de file d'attente STL en C++

Jinku Hu 12 octobre 2023
  1. Utilisez std::queue pour déclarer un objet de file d’attente STL en C++
  2. Utilisez la fonction membre size pour récupérer la taille de la file d’attente en C++
  3. Utilisez la fonction membre swap pour échanger le contenu de deux objets de file d’attente en C++
Utiliser le conteneur de file d'attente STL en C++

Cet article explique comment utiliser le conteneur de file d’attente STL en C++.

Utilisez std::queue pour déclarer un objet de file d’attente STL en C++

La bibliothèque standard C++ fournit plusieurs classes de conteneurs utilisées pour fournir des types fondamentaux pour la gestion des collections d’objets. Cependant, il existe des conteneurs spéciaux appelés adaptateurs de conteneurs, qui transforment des conteneurs fondamentaux pour des besoins spéciaux avec l’interface la plus restreinte.

L’un de ces adaptateurs de conteneur est std::queue, qui adapte les conteneurs de séquence pour fournir une structure de données FIFO (premier entré-premier sorti). Notez que le conteneur fondamental sous-jacent doit implémenter les exigences SequenceContainer et avoir quatre fonctions membres : back, front, push_back et pop_front. Seules les fonctions std::deque et std::list des conteneurs fondamentaux satisfont aux exigences ci-dessus et peuvent donc être utilisées pour stocker des éléments queue.

#include <iostream>
#include <queue>

using std::cout;
using std::endl;
using std::queue;
using std::string;

template <typename Queue>
void printQueue(Queue q) {
  while (!q.empty()) {
    cout << q.front() << ", ";
    q.pop();
  }
  cout << endl;
}

int main() {
  std::queue<string> q1;
  std::deque<string> deq1 = {"one", "eight", "six", "seven", "eleven", "ten"};

  for (const auto& n : deq1) q1.push(n);
  printQueue(q1);

  std::queue<string> q2(deq1);
  printQueue(q2);

  return EXIT_SUCCESS;
}

Production:

one, eight, six, seven, eleven, ten, one, eight, six, seven, eleven, ten,

Le conteneur std::queue peut être initialisé à l’aide de l’objet std::deque existant. Le constructeur de cette dernière initialisation n’a besoin que d’un argument de type deque. D’autre part, nous pouvons déclarer un objet queue et ajouter des éléments à l’aide de la fonction push. Dans l’extrait de code ci-dessus, nous démontrons les méthodes ci-dessus et imprimons le contenu des files d’attente à l’aide de la fonction printQueue.

Notez que l’itération sur les éléments de la file d’attente se fait avec la boucle while utilisant la fonction empty car les itérateurs ne sont pas accessibles. Dans chaque cycle de boucle, nous accédons au premier élément à l’aide de la fonction membre front et utilisons pop pour supprimer le même élément. Puisque cette dernière opération modifie l’objet de file d’attente d’origine, nous l’acceptons comme argument de valeur plutôt que comme référence.

Utilisez la fonction membre size pour récupérer la taille de la file d’attente en C++

Vous pouvez utiliser la fonction membre size pour récupérer le nombre d’éléments dans l’objet file d’attente. La fonction a une performance temporelle constante.

#include <iostream>
#include <queue>

using std::cout;
using std::endl;
using std::queue;
using std::string;

int main() {
  std::deque<string> deq1 = {"one", "eight", "six", "seven", "eleven", "ten"};

  std::queue<string> q2(deq1);

  cout << "size of the queue = " << q2.size() << endl;

  return EXIT_SUCCESS;
}

Production:

size of the queue = 6

Utilisez la fonction membre swap pour échanger le contenu de deux objets de file d’attente en C++

Nous pouvons échanger les éléments de deux objets de file d’attente à l’aide de la fonction membre swap. Il prend un autre objet file d’attente comme seul argument et échange son contenu avec l’objet appelant. Notez que l’objet argument a affecté le contenu de la file d’attente des appelants.

#include <iostream>
#include <queue>

using std::cout;
using std::endl;
using std::queue;
using std::string;

template <typename Queue>
void printQueue(Queue q) {
  while (!q.empty()) {
    cout << q.front() << ", ";
    q.pop();
  }
  cout << endl;
}

int main() {
  std::queue<string> q1;
  std::deque<string> deq1 = {"one", "eight", "six", "seven", "eleven", "ten"};

  for (const auto& n : deq1) q1.push(n);

  std::queue<string> q2(deq1);
  q2.push(deq1.front());
  q2.push("zero");

  cout << "q1: ";
  printQueue(q1);
  cout << "q2: ";
  printQueue(q2);

  q1.swap(q2);

  cout << "q1: ";
  printQueue(q1);
  cout << "q2: ";
  printQueue(q2);

  return EXIT_SUCCESS;
}

Production:

q1 : one,
     eight,
     six,
     seven,
     eleven,
     ten,
     q2 : one,
          eight,
          six,
          seven,
          eleven,
          ten,
          one,
          zero,
          q1 : one,
               eight,
               six,
               seven,
               eleven,
               ten,
               one,
               zero,
               q2 : one,
                    eight,
                    six,
                    seven,
                    eleven,
                    ten,
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Article connexe - C++ Queue