Usare la classe PRIORITY_QUEUE STL con un tipo personalizzato
Questo articolo descrive come definire una classe adattatore del contenitore di modelli STL (Standard Template Library) priority_queue
che usa tipi di dati personalizzati (definiti dall'utente).
Versione originale del prodotto: Visual C++
Numero KB originale: 837697
Riepilogo
Questo articolo descrive come usare la classe adattatore contenitore modello STL priority_queue
con tipi di dati personalizzati (definiti dall'utente), ad esempio strutture e classi. Questo articolo descrive anche come ordinare i membri della classe eseguendo l'overload priority_queue
degli operatori di confronto parentesi angolari sinistra (<) o parentesi angolari destra (>). Questo articolo descrive anche come dichiarare le variabili della priority_queue
classe contenitore che contengono i membri dati personalizzati (definiti dall'utente) e come accedere a queste variabili nel programma. Le informazioni contenute in questo articolo si applicano solo al codice Visual C++ non gestito.
Requisiti
Questo articolo presuppone che si abbia familiarità con la programmazione con i tipi di dati STL e i tipi di contenitore.
Creazione di un tipo di dati personalizzato
La priority_queue
classe è una classe adattatore contenitore modello che limita l'accesso all'elemento principale di un tipo di contenitore sottostante. Per limitare l'accesso all'elemento superiore di un tipo di contenitore sottostante è sempre la priorità più alta. È possibile aggiungere nuovi elementi alla priority_queue
classe ed esaminare o rimuovere l'elemento principale della priority_queue
classe.
Per usare la priority_queue
classe con i tipi di dati personalizzati (definiti dall'utente), è necessario definire un tipo di dati personalizzato, come illustrato nel codice seguente:
//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){}
};
Nota
Per definire una struttura per lo stesso scopo, è possibile sostituire class
con struct
in questo esempio di codice.
Specificare l'ordine coda
È possibile specificare l'ordine dei membri della priority_queue
classe eseguendo l'overload della parentesi quadra quadra destra o degli operatori di confronto tra parentesi angolari a sinistra, come illustrato nell'esempio di codice seguente:
//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;
}
Creare e accedere a variabili priority_queue con tipi di dati personalizzati
Il prototipo della priority_queue
classe modello è il seguente:
template <
class Type,
class Container=vector<Type>,
class Compare=less<typename Container::value_type>
>
class priority_queue
Dichiarare una priority_queue
variabile che specifica il tipo di dati personalizzato e l'operatore di confronto come indicato di seguito:
priority_queue<Student, vector<Student>,less<vector<Student>::value_type> > pqStudent1;
È possibile utilizzare metodi diversi della priority_queue
classe, ad push
esempio , pop
, empty
e altri metodi, come indicato di seguito:
// 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();
}
Elenco di codice completo
// 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;
}
}
È necessario aggiungere l'opzione del compilatore di supporto di Common Language Runtime (/clr:oldSyntax) in Visual C++ per compilare correttamente l'esempio di codice precedente. Per aggiungere l'opzione del compilatore di supporto di Common Language Runtime in Visual C++, seguire questa procedura:
Fare clic su Progetto e quindi su <Proprietà NomeProgetto>.
Nota
<ProjectName> è un segnaposto per il nome del progetto.
Espandere Proprietà di configurazione e quindi selezionare Generale.
Selezionare Supporto di Common Language Runtime, sintassi precedente (/clr:oldSyntax) nell'impostazione del progetto di supporto di Common Language Runtime nel riquadro destro, selezionare Applica e quindi selezionare OK.
Per altre informazioni sull'opzione del compilatore di supporto di Common Language Runtime, vedere /clr (Compilazione Common Language Runtime).
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: nel corso del 2024 verranno dismessi i problemi di GitHub come meccanismo di feedback per il contenuto e verranno sostituiti con un nuovo sistema di feedback. Per altre informazioni, vedere:Invia e visualizza il feedback per