Explication détaillée de la file d'attente C++ STL (premier entré, premier sorti)

Partie I Attention

insérez la description de l'image ici

  • queue<T>Les données de l'adaptateur de conteneur sont organisées de manière FIFO (First in First Out), ce qui peut être imaginé comme une équipe de personnes attendant de faire de l'acide nucléique.
  • le fichier d'en-tête doit être inclus#include <queue>
  • Le fichier d'en-tête queuedéfinit non seulement queue, mais définit également priority_queue.
  • priority_queue<T>: file d'attente prioritaire, qui est queuedifférente de celle en ce sens que nous pouvons personnaliser la priorité des données qu'elle contient, de sorte que la file d'attente prioritaire soit devant la file d'attente et que la priorité soit hors de la file d'attente. La valeur par défaut est l'ordre décroissant, la grande pile racine et le plus grand élément à la tête de l'équipe.
  • pop()Supprime le premier élément de la file d'attente, mais ne renvoie rien.

Part.II Fonction

Chap.I file d'attente

queueL'objet est très simple, il n'a que 9 fonctions, comme le montre la figure ci-dessous :

insérez la description de l'image ici

Voici une description de chaque fonction :

fonction expliquer
front() Renvoie une référence au premier élément de la file d'attente. Si la file d'attente est constante, une référence const est renvoyée ; si la file d'attente est vide, la valeur de retour est indéfinie.
back() Renvoie une référence au dernier élément de la file d'attente. Si la file d'attente est constante, une référence const est renvoyée ; si la file d'attente est vide, la valeur de retour est indéfinie.
push(const T& obj) Ajoute une copie de l'élément à la fin de la file d'attente. Cela se push_back()fait en appelant les fonctions membres du conteneur sous-jacent.
push(T&& obj) Ajoute des éléments à la fin de la file d'attente de manière décalée. push_back()Cela se fait en appelant les fonctions membres du conteneur sous-jacent qui ont des paramètres de référence rvalue .
pop() Supprime le premier élément de la file d'attente, ne renvoie rien.
size() Renvoie le nombre d'éléments dans la file d'attente.
empty() Renvoie true s'il n'y a aucun élément dans la file d'attente.
emplace() Invoquer le constructeur de T avec les arguments passés à emplace() produit des objets à la fin de la file d'attente.
swap(queue<T> &other_q) Échangez les éléments de la file d'attente actuelle avec les éléments de la file d'attente de paramètres. Ils doivent contenir des éléments du même type. Vous pouvez également appeler le modèle de fonction global swap() pour accomplir la même opération.

Chap.II file_prioritaire

priority_queueLes fonctions des objets et queuedes objets ne sont pas les mêmes, et ses fonctions sont quelque peu similaires aux fonctions de la pile, comme suit :

fonction signification
push(const T& obj) Met une copie de obj en place dans le conteneur, incluant généralement une opération de tri.
push(T&& obj) Placez obj dans la position appropriée dans le conteneur, ce qui inclut généralement une opération de tri.
emplace(T constructor a rgs...) Construit un Tobjet à la position appropriée dans la séquence en appelant le constructeur passé dans les arguments. Pour maintenir l'ordre de priorité, une opération de tri est généralement requise.
top() Renvoie une référence au premier élément de la file d'attente prioritaire.
pop() Retirez le premier élément.
size() Renvoie le nombre d'éléments dans la file d'attente.
empty() Renvoie vrai si la file d'attente est vide.
swap(priority_queue<T>& other) Permutés avec les éléments de l'argument, les objets contenus doivent être du même type.

Code de la partie III

Ce qui suit est un exemple simple écrit par l'auteur pour apprendre cette structure de données.

Chap.I file d'attente

Le code complet est le suivant :

#include <iostream>
#include <iomanip>
#include <queue>

using namespace std;

int main()
{
    
    
    int tmp=0;
    queue<int> que({
    
    0,1,2,3});  // queue<int> que;
    queue<int> que1({
    
    0,1,2,3}); 
    cout<< que.back() << setw(3) << que.front() <<endl;
    que.push(4);
    que.emplace(5);
    cout<< que.back() << setw(3) << que.front() << setw(3) << que.size() <<endl;
    que.pop();
    cout<< que.back() << setw(3) << que.front() << setw(3) << que.size() <<endl;
    que.swap(que1);
    cout<< que.back() << setw(3) << que.front() << setw(3) << que.size() <<endl;
    getchar();
    return 0;
}

La sortie est la suivante :

3  0
5  0  6
5  1  5
3  0  4

Chap.II file_prioritaire

Le code complet est le suivant :

#include <iostream>
#include <iomanip>
#include <queue>
#include <vector>

using namespace std;

int main()
{
    
    
    int tmp=0;
    string st[]={
    
    "one","two","three","four","five","six","seven"};
    priority_queue<string, vector<string>, greater<string>> pq;  // priority_queue<string> que;
    priority_queue<string, vector<string>, greater<string>> pq1;
    for(auto& c:st) {
    
     pq.push(c); }
    pq1=pq;
    while(!pq.empty()) {
    
    
        cout<<pq.top()<<" ";
        pq.pop();
    }
    cout<<endl;
    cout<<setw(3)<<pq.size()<<setw(3)<<pq1.size()<<endl;
    pq.swap(pq1);
    cout<<setw(3)<<pq.size()<<setw(3)<<pq1.size()<<endl;
    getchar();
    return 0;
}

La sortie est la suivante :

five four one seven six three two
  0  7
  7  0

Regardez priority_queuele constructeur :

priority_queue<T> p; //默认降序,大根堆,队头元素最大
priority_queue<T, vector<T>, less<T>> p; //相当于默认
priority_queue<T, vector<T>, greater<T>> p; //升序,最小值优先级队列,小根堆
priority_queue<string, vector<string>, greater<string>> pq
  • Le premier paramètre est un objet fonction utilisé pour trier les éléments
  • Le deuxième paramètre est un conteneur fournissant l'élément initial
  • Le troisième paramètre spécifie les règles de tri

Tout le reste est plus facile à comprendre.

Je suppose que tu aimes

Origine blog.csdn.net/Gou_Hailong/article/details/128381738
conseillé
Classement