Utiliser la classe PRIORITY_QUEUE STL avec un type personnalisé

Cet article explique comment définir une classe d’adaptateur de conteneur de modèle STL (Standard Template Library) priority_queue qui utilise des types de données personnalisés (définis par l’utilisateur).

Version d’origine du produit : Visual C++
Numéro de la base de connaissances d’origine : 837697

Résumé

Cet article explique comment utiliser la classe d’adaptateur de conteneur de modèle STL priority_queue avec des types de données personnalisés (définis par l’utilisateur), tels que des structures et des classes. Cet article explique également comment classer les membres de classe priority_queue en surchargeant les opérateurs de comparaison du crochet gauche (<) ou du crochet droit (>). Cet article explique également comment déclarer les priority_queue variables de classe de conteneur qui contiennent les membres de données personnalisés (définis par l’utilisateur) et comment accéder à ces variables dans votre programme. Les informations contenues dans cet article s’appliquent uniquement au code Visual C++ non managé.

Configuration requise

Cet article suppose que vous êtes familiarisé avec la programmation avec les types de données STL et les types de conteneur.

Création d’un type de données personnalisé

La priority_queue classe est une classe d’adaptateur de conteneur de modèle qui limite l’accès à l’élément supérieur d’un type de conteneur sous-jacent. La priorité la plus élevée est toujours de limiter l’accès à l’élément supérieur d’un type de conteneur sous-jacent. Vous pouvez ajouter de nouveaux éléments à la priority_queue classe et vous pouvez examiner ou supprimer l’élément supérieur de la priority_queue classe.

Pour utiliser la priority_queue classe avec les types de données personnalisés (définis par l’utilisateur), vous devez définir un type de données personnalisé comme indiqué dans le code suivant :

//Define a custom data type.
class Student
{
    public:
    char* chName;
    int nAge;
    Student(): chName(""),nAge(0){}
    Student( char* chNewName, int nNewAge ):chName(chNewName), nAge(nNewAge){}
};

Remarque

Pour définir une structure dans le même but, vous pouvez remplacer par classstruct dans cet exemple de code.

Spécifier l’ordre de file d’attente

Vous pouvez spécifier l’ordre des membres de la priority_queue classe en surchargeant le crochet droit ou les opérateurs de comparaison de crochets angulaires gauches, comme indiqué dans l’exemple de code suivant :

//Overload the < operator.
bool operator< (const Student& structstudent1, const Student &structstudent2)
{
    return structstudent1.nAge > structstudent2.nAge;
}
//Overload the > operator.
bool operator> (const Student& structstudent1, const Student &structstudent2)
{
    return structstudent1.nAge < structstudent2.nAge;
}

Créer des variables priority_queue avec des types de données personnalisés et y accéder

Le prototype de la priority_queue classe de modèle est le suivant :

template <
  class Type,
  class Container=vector<Type>,
  class Compare=less<typename Container::value_type>
>
class priority_queue

Déclarez une priority_queue variable qui spécifie le type de données personnalisé et l’opérateur de comparaison comme suit :

priority_queue<Student, vector<Student>,less<vector<Student>::value_type> > pqStudent1;

Vous pouvez utiliser différentes méthodes de la priority_queue classe, telles que push, pop, emptyet d’autres méthodes comme suit :

// Add container elements.
pqStudent1.push( Student( "Mark", 38 ));
pqStudent1.push( Student( "Marc", 25 ));
pqStudent1.push( Student( "Bill", 47 ));
pqStudent1.push( Student( "Andy", 13 ));
pqStudent1.push( Student( "Newt", 44 ));

//Display container elements.
while ( !pqStudent1.empty())
{
    cout << pqStudent1.top().chName << endl;
    pqStudent1.pop();
}

Liste complète du code

// The debugger cannot handle symbols that are longer than 255 characters.
// STL frequently creates symbols that are longer than 255 characters.
// When symbols are longer than 255 characters, the warning is disabled.
#pragma warning(disable:4786)
#include "stdafx.h"
#include <queue>

#using <mscorlib.dll>

#if _MSC_VER > 1020 // if VC++ version is > 4.2
  using namespace std; // std c++ libs implemented in std
#endif
using namespace System;

//Define a custom data type.
class Student
{
    public:
    char* chName;
    int nAge;
    Student(): chName(""),nAge(0){}
    Student( char* chNewName, int nNewAge ):chName(chNewName), nAge(nNewAge){}
    };

    //Overload the < operator.
    bool operator< (const Student& structstudent1, const Student &structstudent2)
    {
        return structstudent1.nAge > structstudent2.nAge;
    }
    //Overload the > operator.
    bool operator> (const Student& structstudent1, const Student &structstudent2)
    {
        return structstudent1.nAge < structstudent2.nAge;
    }

    int _tmain()
    {
      //Declare a priority_queue and specify the ORDER as <
      //The priorities will be assigned in the Ascending Order of Age
      priority_queue<Student, vector<Student>,less<vector<Student>::value_type> > pqStudent1;

      //declare a priority_queue and specify the ORDER as >
      //The priorities will be assigned in the Descending Order of Age
      priority_queue<Student, vector<Student>,greater<vector<Student>::value_type> > pqStudent2;

      // Add container elements.
      pqStudent1.push( Student( "Mark", 38 ));
      pqStudent1.push( Student( "Marc", 25 ));
      pqStudent1.push( Student( "Bill", 47 ));
      pqStudent1.push( Student( "Andy", 13 ));
      pqStudent1.push( Student( "Newt", 44 ));

      //Display container elements.
      while ( !pqStudent1.empty())
      {
          cout << pqStudent1.top().chName << endl;
          pqStudent1.pop();
      }
      cout << endl;

      // Add container elements.
      pqStudent2.push( Student( "Mark", 38 ));
      pqStudent2.push( Student( "Marc", 25 ));
      pqStudent2.push( Student( "Bill", 47 ));
      pqStudent2.push( Student( "Andy", 13 ));
      pqStudent2.push( Student( "Newt", 44 ));

      //Display container elements.
      while ( !pqStudent2.empty())
      {
          cout << pqStudent2.top().chName << endl;
          pqStudent2.pop();
      }
      cout << endl;
      return 0;
    }
}

Vous devez ajouter l’option de compilateur de prise en charge du Common Language Runtime (/clr :oldSyntax) dans Visual C++ pour compiler correctement l’exemple de code précédent. Pour ajouter l’option de compilateur de prise en charge du Common Language Runtime dans Visual C++, procédez comme suit :

  1. Cliquez sur Projet, puis sur <Propriétés du nom du> projet.

    Remarque

    <ProjectName> est un espace réservé pour le nom du projet.

  2. Développez Propriétés de configuration, puis sélectionnez Général.

  3. Sélectionnez Prise en charge du Common Language Runtime, Ancienne syntaxe (/clr :oldSyntax) dans le paramètre de projet de prise en charge du Common Language Runtime dans le volet droit, sélectionnez Appliquer, puis OK.

Pour plus d’informations sur l’option de compilateur de prise en charge du Common Language Runtime, consultez /clr (Compilation du Common Language Runtime).