Introducción a las colas de tareas en C++
La cola de tareas (queue) es una de las estructuras de datos fundamentales en programación que funciona según el principio FIFO (First In, First Out): el primer elemento agregado será el primero en extraerse. Imagínese una cola normal en una tienda: el primer cliente es atendido primero. En C++, el trabajo con colas se implementa a través del contenedor std::queue, que forma parte de la Biblioteca de plantillas estándar (STL).
En este artículo, analizaremos en detalle cómo crear, llenar y procesar colas de tareas en C++. Aprenderá qué métodos están disponibles, cómo evitar errores típicos y cómo se aplican las colas en proyectos reales, desde sistemas multiproceso hasta procesamiento de solicitudes.
Operaciones básicas con colas de tareas
Creación e inicialización de una cola
Para usar una cola en C++, es necesario incluir el archivo de encabezado <queue>. Una cola básica se declara así:
#include <iostream>#include <queue>
int main() { std::queue<int> taskQueue; // Cola de números enteros return 0;}Puede crear una cola para cualquier tipo de datos: cadenas, estructuras definidas por el usuario, punteros. Por ejemplo, una cola de tareas para procesar pedidos:
#include <queue>#include <string>
struct Order { int id; std::string description;};
int main() { std::queue<Order> orderQueue; return 0;}Agregar y eliminar elementos
Los métodos principales para trabajar con la cola:
push()— agrega un elemento al final de la colapop()— elimina el primer elemento de la colafront()— devuelve una referencia al primer elemento (sin eliminarlo)back()— devuelve una referencia al último elementoempty()— verifica si la cola está vacíasize()— devuelve la cantidad de elementos
Veamos un ejemplo con procesamiento paso a paso de tareas:
#include <iostream>#include <queue>
int main() { std::queue<std::string> tasks;
// Agregamos tareas tasks.push("Tarea 1: Revisar el correo"); tasks.push("Tarea 2: Escribir el informe"); tasks.push("Tarea 3: Realizar la reunión");
std::cout << "Primera tarea: " << tasks.front() << std::endl; std::cout << "Última tarea: " << tasks.back() << std::endl; std::cout << "Total de tareas: " << tasks.size() << std::endl;
// Procesamos las tareas en orden while (!tasks.empty()) { std::cout << "Ejecutando: " << tasks.front() << std::endl; tasks.pop(); // Eliminamos la tarea completada }
std::cout << "¡Todas las tareas completadas!" << std::endl; return 0;}Resultado de la ejecución:
Primera tarea: Tarea 1: Revisar el correoÚltima tarea: Tarea 3: Realizar la reuniónTotal de tareas: 3Ejecutando: Tarea 1: Revisar el correoEjecutando: Tarea 2: Escribir el informeEjecutando: Tarea 3: Realizar la reunión¡Todas las tareas completadas!Colas con prioridad: cuando el orden importa
A veces las tareas tienen diferente prioridad. Por ejemplo, un error crítico debe procesarse antes que una actualización planificada. En estos casos se utiliza std::priority_queue, que ordena automáticamente los elementos por prioridad.
#include <iostream>#include <queue>#include <vector>
int main() { // Por defecto — máxima prioridad para el elemento más grande std::priority_queue<int> highPriorityTasks;
highPriorityTasks.push(5); // Tarea normal highPriorityTasks.push(10); // Tarea urgente highPriorityTasks.push(1); // Baja prioridad
while (!highPri