Introdução: por que precisamos de filas de tarefas em C++?
\nImagine que você está em uma fila no caixa do supermercado. O primeiro que chegou é atendido primeiro. Na programação, essa estrutura é chamada de fila (queue). É um dos tipos fundamentais de dados que funciona pelo princípio FIFO (First In, First Out) — "o primeiro a entrar é o primeiro a sair".
\nEm C++, as filas de tarefas são usadas em toda parte: desde o processamento de requisições de rede até o gerenciamento de threads em aplicações multithread. Para um programador iniciante, entender filas é um passo para dominar tópicos mais complexos, como programação assíncrona e padrões de projeto.
\nNeste artigo, vamos explorar como criar e usar filas em C++, analisar o contêiner padrão std::queue, escrever alguns exemplos práticos e discutir erros comuns de iniciantes.
Fundamentos da fila: teoria e primeiro exemplo
\nO que é uma fila?
\nUma fila é um tipo abstrato de dados que suporta duas operações principais:
\n- \n
- Adicionar um elemento ao final da fila (enqueue / push); \n
- Remover um elemento do início da fila (dequeue / pop). \n
Em C++, a fila padrão é implementada no arquivo de cabeçalho <queue> como a classe std::queue. Por padrão, ela usa std::deque como contêiner base, mas você pode substituí-lo por std::list.
Primeiro exemplo: fila de números
\nVamos escrever um programa simples que cria uma fila de números inteiros, adiciona alguns valores e os exibe na tela.
\n#include <iostream>\n#include <queue>\n\nint main() {\n std::queue<int> my_queue;\n\n // Adicionando elementos à fila\n my_queue.push(10);\n my_queue.push(20);\n my_queue.push(30);\n\n std::cout << "Primeiro elemento (front): " << my_queue.front() << std::endl;\n std::cout << "Último elemento (back): " << my_queue.back() << std::endl;\n std::cout << "Tamanho da fila: " << my_queue.size() << std::endl;\n\n // Removendo elementos\n while (!my_queue.empty()) {\n std::cout << "Removido: " << my_queue.front() << std::endl;\n my_queue.pop();\n }\n\n return 0;\n}\nResultado da execução do programa:
\nPrimeiro elemento (front): 10\nÚltimo elemento (back): 30\nTamanho da fila: 3\nRemovido: 10\nRemovido: 20\nRemovido: 30\nObserve: front() retorna o primeiro elemento (que será removido em seguida), e back() retorna o último elemento adicionado. O método pop() remove o elemento, mas não o retorna — é importante lembrar disso!
Métodos principais de std::queue
\nPara trabalhar eficientemente com filas, é necessário conhecer todos os seus métodos. Aqui está a lista completa:
\n- \n
push(const T& value)— adiciona um elemento ao final da fila; \n pop()— remove o primeiro elemento (não o retorna); \n front()— retorna uma referência ao primeiro elemento; \n back()— retorna uma referência ao último elemento; \n empty()— verifica se a fila está vazia (retorna true/false); \n size()— retorna o número de elementos. \n
Importante: Antes de chamar front() ou pop(), sempre verifique se a fila não está vazia usando empty(). Tentar acessar elementos de uma fila vazia resultará em comportamento indefinido (provavelmente, uma falha no programa).
Exemplo prático: fila de tarefas
\nAgora, vamos simular uma situação real. Suponha que temos um sistema que processa pedidos. Cada pedido é uma estrutura com um número e uma descrição. Colocamos os pedidos em uma fila