Поделиться через


Использование класса STL PRIORITY_QUEUE с пользовательским типом

В этой статье описывается определение класса адаптера контейнера шаблона стандартной библиотеки шаблонов (STL), priority_queue использующего пользовательские (определяемые пользователем) типы данных.

Исходная версия продукта: Visual C++
Исходный номер базы знаний: 837697

Итоги

В этой статье описывается, как использовать класс адаптера контейнера шаблона STL priority_queue с пользовательскими (определяемыми пользователем) типами данных, такими как структуры и классы. В этой статье также описывается порядок priority_queue элементов класса путем перегрузки левой угловой скобки (<) или операторов сравнения в правой угловой скобке (>). В этой статье также описывается, как объявить priority_queue переменные класса контейнера, содержащие пользовательские (определяемые пользователем) элементы данных и как получить доступ к этим переменным в программе. Сведения, приведенные в этой статье, относятся только к неуправляемой коду Visual C++.

Требования

В этой статье предполагается, что вы знакомы с программированием с типами данных STL и типами контейнеров.

Создание пользовательского типа данных

Класс priority_queue — это класс адаптера контейнера шаблона, который ограничивает доступ к верхнему элементу определенного базового типа контейнера. Чтобы ограничить доступ к верхнему элементу базового типа контейнера, всегда является самым высоким приоритетом. Вы можете добавить новые элементы в priority_queue класс и проверить или удалить верхний элемент priority_queue класса.

Чтобы использовать priority_queue класс с пользовательскими (определяемыми пользователем) типами данных, необходимо определить пользовательский тип данных, как показано в следующем коде:

//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){}
};

Примечание.

Чтобы определить структуру для той же цели, можно заменить class ее struct в этом примере кода.

Указание порядка ОЧЕРЕДИ

Вы можете указать порядок priority_queue членов класса, перегрузив правые угловые скобки или операторы сравнения угловых скобок слева, как показано в следующем примере кода:

//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;
}

Создание и доступ к переменным priority_queue с пользовательскими типами данных

Прототип priority_queue класса шаблона выглядит следующим образом:

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

Объявите переменную priority_queue , указывающую пользовательский тип данных и оператор сравнения следующим образом:

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

Вы можете использовать различные методы priority_queue класса, такие как push, popemptyи другие методы, как показано ниже.

// 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();
}

Полный листинг кода

// 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;
    }
}

Чтобы успешно скомпилировать предыдущий пример кода, необходимо добавить параметр компилятора среды clr:oldSyntax в Visual C++. Чтобы добавить параметр компилятора среды CLR в Visual C++, выполните следующие действия:

  1. Щелкните "Проект" и выберите <"Свойства ProjectName>".

    Примечание.

    <> Имя проекта — это заполнитель для имени проекта.

  2. Разверните узел "Свойства конфигурации" и выберите "Общие".

  3. Выберите поддержку среды CLR, старый синтаксис (/clr:oldSyntax) в параметре проекта поддержки common Language Runtime в правой области, нажмите кнопку "Применить" и нажмите кнопку "ОК".

Дополнительные сведения о параметре компилятора поддержки среды CLR см. в разделе /clr (компиляция среды CLR).