Ö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, emptyve diğer yöntemleri gibi pushfarklı 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:

  1. Project'e ve ardından ProjectName> Özellikleri'ne tıklayın<.

    Not

    <ProjectName> , projenin adı için bir yer tutucudur.

  2. Yapılandırma Özellikleri'ni genişletin ve genel'i seçin.

  3. 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).