Introducción: ¿para qué sirven las colas de tareas en C++?
\nImagina que estás haciendo cola en la caja de un supermercado. El primero que llega es atendido primero. En programación, esta estructura se llama cola (queue). Es uno de los tipos de datos fundamentales que funciona bajo el principio FIFO (First In, First Out) — «primero en entrar, primero en salir».
\nEn C++, las colas de tareas se utilizan en todas partes: desde el procesamiento de solicitudes de red hasta la gestión de hilos en aplicaciones multiproceso. Para un programador principiante, entender las colas es un paso hacia el dominio de temas más complejos, como la programación asíncrona y los patrones de diseño.
\nEn este artículo, analizaremos cómo crear y usar colas en C++, veremos el contenedor estándar std::queue, escribiremos varios ejemplos prácticos y discutiremos los errores típicos de los principiantes.
Fundamentos de la cola: teoría y primer ejemplo
\n¿Qué es una cola?
\nUna cola es un tipo de dato abstracto que admite dos operaciones principales:
\n- \n
- Agregar un elemento al final de la cola (enqueue / push); \n
- Extraer un elemento del principio de la cola (dequeue / pop). \n
En C++, la cola estándar se implementa en el archivo de encabezado <queue> como la clase std::queue. Por defecto, utiliza std::deque como contenedor subyacente, pero puedes reemplazarlo por std::list.
Primer ejemplo: cola de números
\nEscribamos un programa simple que crea una cola de números enteros, agrega varios valores y los muestra en pantalla.
\n#include <iostream>\n#include <queue>\n\nint main() {\n std::queue<int> my_queue;\n\n // Agregamos elementos a la cola\n my_queue.push(10);\n my_queue.push(20);\n my_queue.push(30);\n\n std::cout << "Primer elemento (front): " << my_queue.front() << std::endl;\n std::cout << "Último elemento (back): " << my_queue.back() << std::endl;\n std::cout << "Tamaño de la cola: " << my_queue.size() << std::endl;\n\n // Extraemos elementos\n while (!my_queue.empty()) {\n std::cout << "Extraído: " << my_queue.front() << std::endl;\n my_queue.pop();\n }\n\n return 0;\n}\nResultado del programa:
\nPrimer elemento (front): 10\nÚltimo elemento (back): 30\nTamaño de la cola: 3\nExtraído: 10\nExtraído: 20\nExtraído: 30\nTen en cuenta: front() devuelve el primer elemento (que se extraerá a continuación), y back() devuelve el último elemento agregado. El método pop() elimina el elemento, pero no lo devuelve, ¡esto es importante recordarlo!
Métodos principales de std::queue
\nPara trabajar eficientemente con una cola, necesitas conocer todos sus métodos. Aquí tienes la lista completa:
\n- \n
push(const T& value)— agrega un elemento al final de la cola; \n pop()— elimina el primer elemento (no lo devuelve); \n front()— devuelve una referencia al primer elemento; \n back()— devuelve una referencia al último elemento; \n empty()— verifica si la cola está vacía (devuelve true/false); \n size()— devuelve la cantidad de elementos. \n
Importante: Antes de llamar a front() o pop(), siempre verifica si la cola no está vacía usando empty(). Intentar acceder a elementos de una cola vacía provocará un comportamiento indefinido (probablemente, un fallo del programa).
Ejemplo práctico: cola de tareas
\nAhora simulemos una situación real. Supongamos que tenemos un sistema que procesa pedidos. Cada pedido es una estructura con un número y una descripción. Colocamos los pedidos en una cola