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_backpara adicionar pelo menos três strings. - Remover o primeiro elemento com
erasee iterador. - Imprimir os elementos com
at()e com iteradores. - Capturar e tratar
std::out_of_rangeao 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
- Criamos um vector de strings vazio.
- Usamos
emplace_backpara construir as strings diretamente no vector, evitando cópias temporárias. - Imprimimos a fila inicial com um
forbaseado em intervalo. - Verificamos se a fila não está vazia, imprimimos o primeiro elemento com
front()e o removemos comerase(fila.begin()). - Imprimimos a fila restante usando
at(i)em um loop com índice. - Imprimimos novamente usando iteradores explícitos (
begin()eend()). - Tentamos acessar o índice 5 com
at(5), que lançastd::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 porerasese 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