Özel türle STL PRIORITY_QUEUE sınıfını kullanma
Bu makalede, özel (kullanıcı tanımlı) veri türlerini kullanan bir Standart Şablon Kitaplığı (STL) priority_queue
şablon kapsayıcı bağdaştırıcısı sınıfının nasıl tanımlanacağı açıklanmaktadır.
Orijinal ürün sürümü: Visual C++
Özgün KB numarası: 837697
Özet
Bu makalede, yapılar ve sınıflar gibi özel (kullanıcı tanımlı) veri türleriyle STL priority_queue
şablon kapsayıcı bağdaştırıcısı sınıfının nasıl kullanılacağı açıklanmaktadır. Bu makalede, sol açılı ayraç () veya sağ açılı ayraç> (<) karşılaştırma işleçlerini aşırı yükleyerek sınıf üyelerinin nasıl sıralandığı priority_queue
da açıklanır. Bu makalede ayrıca özel (kullanıcı tanımlı) veri üyelerini içeren kapsayıcı sınıfı değişkenlerini bildirme priority_queue
ve programınızda bu değişkenlere erişme işlemleri de açıklanır. Bu makaledeki bilgiler yalnızca yönetilmeyen Visual C++ kodu için geçerlidir.
Gereksinimler
Bu makalede, STL veri türleri ve kapsayıcı türleriyle programlama hakkında bilgi sahibi olduğunuz varsayılır.
Özel veri türü oluşturma
priority_queue
sınıfı, erişimi temel alınan bir kapsayıcı türünün en üst öğesiyle sınırlayan bir şablon kapsayıcı bağdaştırıcısı sınıfıdır. Temel alınan kapsayıcı türünün en üst öğesiyle erişimi sınırlamak her zaman en yüksek önceliktir. Sınıfına yeni öğeler ekleyebilir ve sınıfın priority_queue
en üst öğesini priority_queue
inceleyebilir veya kaldırabilirsiniz.
sınıfını priority_queue
özel (kullanıcı tanımlı) veri türleriyle kullanmak için, aşağıdaki kodda gösterildiği gibi özel bir veri türü tanımlamanız gerekir:
//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){}
};
Not
Aynı amaca yönelik bir yapı tanımlamak için değerini bu kod örneğinde ile struct
değiştirebilirsinizclass
.
QUEUE sırasını belirtme
Aşağıdaki kod örneğinde priority_queue
gösterildiği gibi sağ açılı ayraç veya sol açılı ayraç karşılaştırma işleçlerini aşırı yükleyerek sınıf üyelerinin sırasını belirtebilirsiniz:
//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;
}
Özel veri türleriyle priority_queue değişkenleri oluşturma ve bu değişkenlere erişme
Şablon sınıfının prototipi priority_queue
aşağıdaki gibidir:
template <
class Type,
class Container=vector<Type>,
class Compare=less<typename Container::value_type>
>
class priority_queue
Özel veri türünü ve karşılaştırma işlecini belirten bir priority_queue
değişken bildirin:
priority_queue<Student, vector<Student>,less<vector<Student>::value_type> > pqStudent1;
sınıfının , pop
, empty
ve diğer yöntemleri gibi push
farklı yöntemlerini priority_queue
aşağıdaki gibi kullanabilirsiniz:
// 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();
}
Tam kod listesi
// 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;
}
}
Önceki kod örneğini başarıyla derlemek için Visual C++ içine ortak dil çalışma zamanı desteği derleyici seçeneğini (/clr:oldSyntax) eklemeniz gerekir. Visual C++'da ortak dil çalışma zamanı desteği derleyicisi seçeneğini eklemek için şu adımları izleyin:
Project'e ve ardından ProjectName> Özellikleri'ne tıklayın<.
Not
<ProjectName> , projenin adı için bir yer tutucudur.
Yapılandırma Özellikleri'ni genişletin ve genel'i seçin.
Sağ bölmedeki Ortak Dil Çalışma Zamanı destek projesi ayarında Ortak Dil Çalışma Zamanı Desteği, Eski Söz Dizimi (/clr:oldSyntax) seçeneğini belirleyin, Uygula'yı ve ardından Tamam'ı seçin.
Ortak dil çalışma zamanı desteği derleyici seçeneği hakkında daha fazla bilgi için bkz. /clr (Ortak Dil Çalışma Zamanı Derlemesi).
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin