C ++

Cómo utilizar C ++ Priority_queue?

Cómo utilizar C ++ Priority_queue?
En C ++, una cola es una estructura de datos de lista donde el primer elemento que se colocará en la lista es el primer elemento que se eliminará, cuando se lleve a cabo la eliminación. Una cola de prioridad en C ++ es similar, pero tiene cierto orden; es el elemento de mayor valor el que se elimina primero. La cola de prioridad aún se puede configurar para que sea el elemento con el menor valor el que se elimine primero. Cualquier cola debe tener al menos el empujar() función y la música pop() función. La empujar() función agrega un nuevo elemento en la parte posterior. Para la cola normal, el música pop() La función elimina el primer elemento introducido. Para la cola de prioridad, el música pop() La función elimina el elemento con la prioridad más alta, que podría ser el más grande o el más pequeño, según el esquema de pedido.

Para usar el priority_queue de C ++, el programa debe comenzar con un código como:

#incluir
#incluir
usando el espacio de nombres std;

Incluye la biblioteca de colas en el programa.

Para continuar leyendo, el lector debería haber tenido un conocimiento básico de C++.

Contenido del artículo

  • Introducción - ver arriba
  • Construcción básica
  • Funciones importantes de los miembros
  • Otras funciones de cola de prioridad
  • Datos de cadena
  • Otras construcciones de colas de prioridad
  • Conclusión

Construcción básica

La estructura de datos debe construirse primero antes de que pueda usarse. La construcción aquí significa instanciar un objeto de la clase de cola de la biblioteca. El objeto de cola debe tener un nombre dado por el programador. La sintaxis más simple para crear una cola de prioridad es:

cola_prioridad queueName;

Con esta sintaxis, el mayor valor se elimina primero. Un ejemplo de instanciación es:

cola_prioridad pq;

o

cola_prioridad pq;

El vector y la deque son dos estructuras de datos en C++. Se puede crear un priority_queue con cualquiera de ellos. La sintaxis para crear una cola de prioridad a partir de la estructura vectorial es:

cola_prioridad, comparar> pq;

Un ejemplo de esta instanciación es:

cola_prioridad, menos > pq;

Observe el espacio entre> y> al final de la declaración. Esto es para evitar confusiones con >>. El código de comparación predeterminado es "menos”, Lo que significa que el valor más grande, y no necesariamente el primer valor, se eliminaría primero. Entonces, la declaración de creación se puede escribir simplemente como:

cola_prioridad > pq;

Si el valor mínimo debe eliminarse primero, entonces la declaración debe ser:

cola_prioridad, mayor que > pq;

Funciones importantes de los miembros

La función push ()
Esta función empuja un valor, que es su argumento, a priority_queue. Vuelve vacío. El siguiente código ilustra esto:

cola_prioridad pq;
pq.empujar (10);
pq.empujar (30);
pq.empujar (20);
pq.empujar (50);
pq.empujar (40);

Este priority_queue ha recibido 5 valores enteros del orden de 10, 30, 20, 50, 40. Si todos estos elementos se van a sacar de la cola de prioridad, saldrán en el orden de 50, 40, 30, 20, 10.

La función pop ()
Esta función elimina de priority_queue el valor con la prioridad más alta. Si el código de comparación es "mayor", Luego eliminará el elemento con el valor más pequeño. Si se vuelve a llamar, elimina el siguiente elemento con el valor más pequeño del resto; llamado de nuevo, elimina el siguiente valor más pequeño presente, y así sucesivamente. Vuelve vacío. El siguiente código ilustra esto:

cola_prioridad, mayor que > pq;
pq.empujar ('a'); pq.empujar ('c'); pq.empujar ('b'); pq.empujar ('e'); pq.empujar ('d');

Tenga en cuenta que para llamar a una función miembro, el nombre del objeto debe ir seguido de un punto y luego la función.

La función top ()
La música pop() La función elimina el siguiente valor de mayor prioridad, pero no lo devuelve, ya que música pop() es una función nula. Utilizar el cima() función para conocer el valor de máxima prioridad que debe eliminarse a continuación. La cima() La función devuelve una copia del valor de mayor prioridad en priority_queue. El siguiente código, donde el siguiente valor de mayor prioridad es el menor valor, ilustra esto

cola_prioridad, mayor que > pq;
pq.empujar ('a'); pq.empujar ('c'); pq.empujar ('b'); pq.empujar ('e'); pq.empujar ('d');
char ch1 = pq.cima(); pq.música pop();
char ch2 = pq.cima(); pq.música pop();
char ch3 = pq.cima(); pq.música pop();
char ch4 = pq.cima(); pq.música pop();
char ch5 = pq.cima(); pq.música pop();
cout<La salida es 'a "b" c "d" e'.

La función vacía ()
Si un programador usa el cima() función en un priority_queue vacío, después de la compilación exitosa, recibiría un mensaje de error como:

Fallo de segmentación (núcleo volcado)

Por lo tanto, siempre verifique si la cola de prioridad no está vacía antes de usar el cima() función. La vacío() la función miembro devuelve un bool, verdadero, si la cola está vacía, y falso si la cola no está vacía. El siguiente código ilustra esto:

cola_prioridad pq;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.empujar (i1); pq.empujar (i2); pq.empujar (i3); pq.empujar (i4); pq.empujar (i5);
tiempo(!pq.vacío())

cout << pq.top() << ";
pq.música pop();

cout << '\n';

Otras funciones de cola de prioridad

La función size ()
Esta función devuelve la longitud de la cola de prioridad, como lo ilustra el siguiente código:

cola_prioridad pq;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.empujar (i1); pq.empujar (i2); pq.empujar (i3); pq.empujar (i4); pq.empujar (i5);
int len ​​= pq.Talla();
cout << len << '\n';

La salida es 5.

La función swap ()
Si dos priority_queues son del mismo tipo y tamaño, esta función puede intercambiarlas, como muestra el siguiente código:

cola_prioridad pq1;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq1.empujar (i1); pq1.empujar (i2); pq1.empujar (i3); pq1.empujar (i4); pq1.empujar (i5);
cola_prioridad pqA;
int it1 = 1; int it2 = 3; int it3 = 2; int it4 = 5; int it5 = 4;
pqA.empujar (it1); pqA.empujar (it2); pqA.empujar (it3); pqA.empujar (it4); pqA.empujar (it5);
pq1.intercambio (pqA);
tiempo(!pq1.vacío())

cout << pq1.top() << ";
pq1.música pop();
cout<<'\n';
tiempo(!pqA.vacío())

cout << pqA.top() << ";
pqA.música pop();
cout<<'\n';

La salida es:

5 4 3 2 1
50 40 30 20 10

La función emplace ()
La emplazamiento () la función es similar a la función de empuje. El siguiente código ilustra esto:

cola_prioridad pq1;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq1.emplazamiento (i1); pq1.emplazamiento (i2); pq1.emplazamiento (i3); pq1.emplazamiento (i4); pq1.emplazamiento (i5);
tiempo(!pq1.vacío())

cout << pq1.top() << ";
pq1.música pop();
cout<<'\n';

La salida es:

50 40 30 20 10

Datos de cadena

Al comparar cadenas, se debe usar la clase de cadena y no el uso directo de los literales de cadena porque compararía punteros y no las cadenas reales. El siguiente código muestra cómo se usa la clase de cadena:

#incluir
cola_prioridad pq1;
cadena s1 = cadena ("bolígrafo"), s2 = cadena ("lápiz"), s3 = cadena ("libro de ejercicios"), s4 = cadena ("libro de texto"), s5 = cadena ("regla");
pq1.empujar (s1); pq1.empujar (s2); pq1.empujar (s3); pq1.empujar (s4); pq1.empujar (s5);
tiempo(!pq1.vacío())

cout << pq1.top() << " ";
pq1.música pop();
cout<<'\n';

La salida es:

libro de texto regla lápiz bolígrafo cuaderno de ejercicios

Otras construcciones de colas de prioridad

Creación explícita a partir de un vector
Se puede crear una cola de prioridad explícitamente a partir de un vector, como muestra el siguiente código:

#incluir
vector vtr = 10, 30, 20, 50, 40;
cola_prioridad pq (vtr.comenzar (), vtr.final());
tiempo(!pq.vacío())

cout << pq.top() << ";
pq.música pop();
cout<<'\n';

La salida es: 50 40 30 20 10. Esta vez, el encabezado vectorial también debe incluirse. Los argumentos de la función constructora toman los punteros inicial y final del vector. El tipo de datos del vector y el tipo de datos de priority_queue deben ser iguales.

Para hacer que el valor mínimo sea la prioridad, la declaración para el constructor sería:

cola_prioridad, mayor> int>> pq (vtr.comenzar (), vtr.final());

Creación explícita a partir de una matriz
Se puede crear una cola de prioridad explícitamente a partir de una matriz, como muestra el siguiente código:

int arr [] = 10, 30, 20, 50, 40;
cola_prioridad pq (arr, arr + 5);
tiempo(!pq.vacío())

cout << pq.top() << ";
pq.música pop();
cout<<'\n';

La salida es: 50 40 30 20 10. Los argumentos de la función constructora toman los punteros de inicio y fin de la matriz. arr devuelve el puntero de inicio, "arr + 5" devuelve el puntero justo después de la matriz, y 5 es el tamaño de la matriz. El tipo de datos de la matriz y el tipo de datos de priority_queue deben ser iguales.

Para hacer que el valor mínimo sea la prioridad, la declaración para el constructor sería:

cola_prioridad, mayor que > pq (arr, arr + 5);

Nota: En C ++, priority_queue en realidad se llama adaptador, no solo contenedor.

Código de comparación personalizado

Tener todos los valores en la cola de prioridad ascendente o descendente no es la única opción para la cola de prioridad. Por ejemplo, una lista de 11 enteros para un montón máximo es:

88, 86, 87, 84, 82, 79,74, 80, 81``, 64, 69

El valor más alto es 88. A esto le siguen dos números: 86 y 87, que son menos de 88. El resto de los números son menores que estos tres números, pero no están realmente en orden. Hay dos celdas vacías en la lista. Los números 84 y 82 son menores que 86. Los números 79 y 74 son menores que 87. Los números 80 y 81 son menores que 84. Los números 64 y 69 son menores que 79.

La ubicación de los números sigue los criterios de montón máximo; ver más adelante. Para proporcionar un esquema de este tipo para priority_queue, el programador tiene que proporcionar su propio código de comparación - ver más adelante.

Conclusión

Un priority_queue de C ++ es una cola de primero en entrar, primero en salir. La función miembro, empujar(), agrega un nuevo valor a la cola. La función miembro, cima(), lee el valor superior en la cola. La función miembro, música pop(), elimina sin devolver el valor superior de la cola. La función miembro, vacío(), comprueba si la cola está vacía. Sin embargo, priority_queue difiere de la cola, en que sigue algún algoritmo de prioridad. Puede ser mayor, del primero al último, o menor, del primero al último. Los criterios (algoritmo) también pueden ser definidos por el programador.

Los 10 mejores juegos para jugar en Ubuntu
La plataforma Windows ha sido una de las plataformas dominantes para juegos debido al gran porcentaje de juegos que se están desarrollando hoy para ad...
5 mejores juegos de arcade para Linux
Hoy en día, las computadoras son máquinas serias que se usan para jugar. Si no puede obtener la nueva puntuación más alta, sabrá a qué me refiero. En ...
Batalla por Wesnoth 1.13.6 Desarrollo liberado
Batalla por Wesnoth 1.13.6 lanzado el mes pasado, es el sexto lanzamiento de desarrollo en el 1.13.x y ofrece una serie de mejoras, sobre todo en la i...