Desafio C++

Fila de strings com emplace_back e iteração segura

Enunciado

Crie um std::vector<std::string> que simula uma fila de atendimento. Adicione três nomes usando emplace_back. Depois, remova o primeiro nome (simulando atendimento) usando erase com iterador. Imprima a fila atual usando at() e iteração com iteradores. Trate possíveis exceções ao acessar índices inválidos.

Requisitos

  • Usar emplace_back para adicionar pelo menos três strings.
  • Remover o primeiro elemento com erase e iterador.
  • Imprimir os elementos com at() e com iteradores.
  • Capturar e tratar std::out_of_range ao tentar acessar índice inválido.

Código inicial

#include <iostream>
#include <vector>
#include <string>
#include <stdexcept>

int main() {
    // Seu código aqui
    return 0;
}

Saída esperada

Fila inicial:
Ana
Bruno
Carla
Atendendo: Ana
Fila restante (com at):
Bruno
Carla
Fila restante (com iteradores):
Bruno
Carla
Tentando acessar índice 5...
Erro: índice fora do intervalo
Ver dica

Use fila.erase(fila.begin()) para remover o primeiro. Para iterar com iteradores, use for (auto it = fila.begin(); it != fila.end(); ++it). Capture std::out_of_range em um bloco try-catch.

Mostrar solução
#include <iostream>
#include <vector>
#include <string>
#include <stdexcept>

int main() {
    std::vector<std::string> fila;

    // Adiciona nomes usando emplace_back
    fila.emplace_back("Ana");
    fila.emplace_back("Bruno");
    fila.emplace_back("Carla");

    std::cout << "Fila inicial:\n";
    for (const auto& nome : fila) {
        std::cout << nome << '\n';
    }

    // Remove o primeiro (atendido)
    if (!fila.empty()) {
        std::cout << "Atendendo: " << fila.front() << '\n';
        fila.erase(fila.begin());
    }

    std::cout << "Fila restante (com at):\n";
    for (std::size_t i = 0; i < fila.size(); ++i) {
        std::cout << fila.at(i) << '\n';
    }

    std::cout << "Fila restante (com iteradores):\n";
    for (auto it = fila.begin(); it != fila.end(); ++it) {
        std::cout << *it << '\n';
    }

    std::cout << "Tentando acessar índice 5...\n";
    try {
        std::cout << fila.at(5) << '\n';
    } catch (const std::out_of_range& e) {
        std::cerr << "Erro: índice fora do intervalo\n";
    }

    return 0;
}

Passo a passo

  1. Criamos um vector de strings vazio.
  2. Usamos emplace_back para construir as strings diretamente no vector, evitando cópias temporárias.
  3. Imprimimos a fila inicial com um for baseado em intervalo.
  4. Verificamos se a fila não está vazia, imprimimos o primeiro elemento com front() e o removemos com erase(fila.begin()).
  5. Imprimimos a fila restante usando at(i) em um loop com índice.
  6. Imprimimos novamente usando iteradores explícitos (begin() e end()).
  7. Tentamos acessar o índice 5 com at(5), que lança std::out_of_range; capturamos e exibimos uma mensagem de erro.

Por que funciona

emplace_back constrói o objeto no local, evitando cópias. erase remove o elemento apontado pelo iterador e desloca os seguintes. at() verifica o índice e lança exceção se inválido. A iteração com iteradores é a forma genérica de percorrer contêineres.

Erros comuns

  • Usar fila.erase(fila.begin()) sem verificar se a fila está vazia: comportamento indefinido.
  • Acessar fila.at(5) sem capturar a exceção: o programa termina abruptamente.
  • Após erase, iteradores para elementos posteriores podem ser invalidados; use o iterador retornado por erase se precisar continuar.

Outra forma de resolver

Usar std::deque ou std::queue para filas, pois erase no início de um vector é O(n). Para poucos elementos, o vector é aceitável.

Saída esperada

Fila inicial:
Ana
Bruno
Carla
Atendendo: Ana
Fila restante (com at):
Bruno
Carla
Fila restante (com iteradores):
Bruno
Carla
Tentando acessar índice 5...
Erro: índice fora do intervalo