Använda STL-PRIORITY_QUEUE-klassen med en anpassad typ
Den här artikeln beskriver hur du definierar en STANDARD-mallcontaineradapterklass (Standard Template Library) priority_queue
som använder anpassade (användardefinierade) datatyper.
Ursprunglig produktversion: Visual C++
Ursprungligt KB-nummer: 837697
Sammanfattning
Den här artikeln beskriver hur du använder STL-mallcontaineradapterklassen priority_queue
med anpassade (användardefinierade) datatyper som strukturer och klasser. Den här artikeln beskriver också hur du beställer priority_queue
klassmedlemmarna genom att överbelasta den vänstra vinkelparentesen (<) eller jämförelseoperatorerna för höger vinkelparentes (>). Den här artikeln beskriver också hur du deklarerar containerklassvariabler priority_queue
som innehåller anpassade (användardefinierade) datamedlemmar och hur du kommer åt dessa variabler i ditt program. Informationen i den här artikeln gäller endast ohanterad Visual C++-kod.
Krav
Den här artikeln förutsätter att du är bekant med programmering med STL-datatyper och containertyper.
Skapa en anpassad datatyp
Klassen priority_queue
är en mallcontaineradapterklass som begränsar åtkomsten till det översta elementet i någon underliggande containertyp. Att begränsa åtkomsten till det översta elementet i en underliggande containertyp är alltid högsta prioritet. Du kan lägga till nya element i priority_queue
klassen och du kan undersöka eller ta bort det översta elementet i priority_queue
klassen.
Om du vill använda priority_queue
klassen med anpassade (användardefinierade) datatyper måste du definiera en anpassad datatyp enligt följande kod:
//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){}
};
Obs!
Om du vill definiera en struktur för samma ändamål kan du ersätta class
med struct
i det här kodexemplet.
Ange KÖORDNING
Du kan ange klassmedlemmarnas priority_queue
ordning genom att överbelasta den högra vinkelparentesen eller jämförelseoperatorerna för vänster vinkelparentes enligt följande kodexempel:
//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;
}
Skapa och komma åt priority_queue variabler med anpassade datatyper
Prototypen för mallklassen priority_queue
är följande:
template <
class Type,
class Container=vector<Type>,
class Compare=less<typename Container::value_type>
>
class priority_queue
Deklarera en priority_queue
variabel som anger den anpassade datatypen och jämförelseoperatorn enligt följande:
priority_queue<Student, vector<Student>,less<vector<Student>::value_type> > pqStudent1;
Du kan använda olika metoder i priority_queue
klassen, till exempel push
, pop
, empty
och andra metoder på följande sätt:
// 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();
}
Fullständig kodlista
// 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;
}
}
Du måste lägga till det gemensamma alternativet för språkkörningsstöd för kompilator (/clr:oldSyntax) i Visual C++ för att kunna kompilera det tidigare kodexemplet. Följ dessa steg om du vill lägga till det vanliga alternativet för språkkörningsstöd för kompilator i Visual C++:
Klicka på Projekt och sedan på <ProjectName-egenskaper>.
Obs!
<ProjectName> är en platshållare för projektets namn.
Expandera Konfigurationsegenskaper och välj sedan Allmänt.
Välj Common Language Runtime Support, Old Syntax (/clr:oldSyntax) i projektinställningen Common Language Runtime support i den högra rutan, välj Använd och välj sedan OK.
Mer information om det vanliga alternativet för språkkörningsstöd för kompilator finns i /clr (Common Language Runtime Compil).
Feedback
https://aka.ms/ContentUserFeedback.
Kommer snart: Under hela 2024 kommer vi att fasa ut GitHub-problem som feedbackmekanism för innehåll och ersätta det med ett nytt feedbacksystem. Mer information finns i:Skicka och visa feedback för