Introdução às Filas de Tarefas em C++
Fila de tarefas (queue) é uma das estruturas de dados fundamentais na programação, que funciona pelo princípio FIFO (First In, First Out): o primeiro elemento adicionado será o primeiro a ser removido. Imagine uma fila comum em uma loja — o primeiro cliente é atendido primeiro. Em C++, o trabalho com filas é implementado através do contêiner std::queue, que faz parte da Biblioteca Padrão de Modelos (STL).
Neste artigo, vamos detalhar como criar, preencher e processar filas de tarefas em C++. Você aprenderá quais métodos estão disponíveis, como evitar erros comuns e como as filas são aplicadas em projetos reais, desde sistemas multithread até processamento de requisições.
Operações Básicas com Filas de Tarefas
Criação e Inicialização da Fila
Para usar uma fila em C++, é necessário incluir o arquivo de cabeçalho <queue>. A fila básica é declarada assim:
#include <iostream>#include <queue>
int main() { std::queue<int> taskQueue; // Fila de números inteiros return 0;}Você pode criar uma fila para qualquer tipo de dado — strings, estruturas personalizadas, ponteiros. Por exemplo, uma fila de tarefas para processamento de pedidos:
#include <queue>#include <string>
struct Order { int id; std::string description;};
int main() { std::queue<Order> orderQueue; return 0;}Adicionar e Remover Elementos
Os principais métodos para trabalhar com a fila:
push()— adiciona um elemento ao final da filapop()— remove o primeiro elemento da filafront()— retorna uma referência ao primeiro elemento (sem remover)back()— retorna uma referência ao último elementoempty()— verifica se a fila está vaziasize()— retorna o número de elementos
Vejamos um exemplo com processamento passo a passo de tarefas:
#include <iostream>#include <queue>
int main() { std::queue<std::string> tasks;
// Adicionando tarefas tasks.push("Tarefa 1: Verificar e-mail"); tasks.push("Tarefa 2: Escrever relatório"); tasks.push("Tarefa 3: Realizar reunião");
std::cout << "Primeira tarefa: " << tasks.front() << std::endl; std::cout << "Última tarefa: " << tasks.back() << std::endl; std::cout << "Total de tarefas: " << tasks.size() << std::endl;
// Processando as tarefas em ordem while (!tasks.empty()) { std::cout << "Executando: " << tasks.front() << std::endl; tasks.pop(); // Remove a tarefa concluída }
std::cout << "Todas as tarefas concluídas!" << std::endl; return 0;}Resultado da execução:
Primeira tarefa: Tarefa 1: Verificar e-mailÚltima tarefa: Tarefa 3: Realizar reuniãoTotal de tarefas: 3Executando: Tarefa 1: Verificar e-mailExecutando: Tarefa 2: Escrever relatórioExecutando: Tarefa 3: Realizar reuniãoTodas as tarefas concluídas!Filas de Prioridade: Quando a Ordem é Importante
Às vezes, as tarefas têm prioridades diferentes. Por exemplo, um erro crítico deve ser processado antes de uma atualização planejada. Nesses casos, usa-se std::priority_queue, que classifica automaticamente os elementos por prioridade.
#include <iostream>#include <queue>#include <vector>
int main() { // Por padrão — prioridade máxima para o maior elemento std::priority_queue<int> highPriorityTasks;
highPriorityTasks.push(5); // Tarefa normal highPriorityTasks.push(10); // Tarefa urgente highPriorityTasks.push(1); // Baixa prioridade
while (!highPri