# Programación en C++/Librería Estándar de Plantillas/Colas

Editores:
Oscar E. Palacios
* ← Librería Estándar de Plantillas

## C++ queue estándar

La Libreria estándar de plantillas soporta el uso de estructuras de cola a travez de la plantilla de clase queue, la cual posee el mecanismo de operación necesario para manejar operaciones de insertar (push), borrar(pop), entre otras. La clase queue posee únicamente seis métodos y dos constructores. En seguida se presenta un ejemplo sumamente básico, el cual consiste en crear una cola para contener elementos de tipo char. Los caracteres se introducen en orden desde la 'A' hasta la 'Z' y, tal como tiene que ser, al recuperarlos se obtienen en el orden ingresados, o sea, desde la 'A' hasta la 'Z'.
   En el programa se debe observar que, se usa el método push para agregar componentes a la lista; el método front regresa una referencia al elemento que se encuentra en el inicio de la cola y este es usado para leer y desplegar el carácter; y se emplea el método pop para eliminar el elemento que está en el frente de la cola.

## Colas con prioridad

Las colas prioritarias ( priority_queue ) de la STL de C++ son parecidas a las colas, con la diferencia de que en estas los elementos se ordenan mediante algun predicado. Aunque se ha dicho que las colas prioritarias son parecidas a las colas, su comportamiento es diferente, ya que en una priority_queue no se cumple el algoritmo FIFO. Por ejemplo, en el siguiente programa se puede observar como se insertan de manera no ordenada elementos a la lista por medio de push, los cuales al ser recuperados se presentan en orden.
La salida del programa anterior es:
y se debe al hecho de que por defecto la función o predicado que compara los elementos de la priority_queue es menor (less). Ahora bien, el predicado puede ser cambiado para que la comparación se mayor (greater) y para lograrlo se debe de usar una plantilla basada en la clase vector o en la clase deque. El programa que se mostrará en seguida es un ejemplo de como usar la clase deque para declarar una priority_queue.
La salida del programa anterior es:

## Copia de contenedor

La magia de una priority_queue nos permite usar un constructor para obtener una copia ordenada de un contenedor ( vector, deque ). Así, en el siguiente ejemplo se muestra como crear una copia de un vector. El resultado es una priority_queue conteniendo en orden a todos los elementos del vector original. Veamos.
Si se compila y ejecuta el programa anterior, la salida en pantalla resultante será:
esto, a pesar de que el predicado ( greater<string> ), usado en la declaración de tipo, indica que los elementos se deben ordenar atendiendo al resultado de una comparación ( mayor que ). El hecho de tales resultados se debe a la naturaleza misma de la priority_queue, es decir, los elementos en esta están realmente ordenados de mayor a menor pero del inicio al fin, luego, como la orden top regresa una referencia al último elemento de la cola, se obtiene asi un listado de los elementos ordenados de menor a mayor.

## Métodos

Tabla de métodos: clase queue :
| Nombre | Descripción | queue | priority_queue |
| empty | cierto (true) si la cola está vacia | Si | Si |
| pop | borra el elemento del frente de la cola | Si | Si |
| push | agrega un elemento al frente de la cola | Si | Si |
| size | regresa el número de elementos en la cola | Si | Si |
| front | regresa una referencia al primer elemento en la cola | Si | No |
| back | regresa una referencia al último elemento en la cola | Si | No |
| top | regresa una referencia al primer elemento en la cola | No | Si |
* ← Librería Estándar de Plantillas