Médio C++
Iteradores reversos e algoritmo
Enunciado
Crie um std::list<std::string> com as frutas {"maçã", "banana", "laranja", "uva"}. Use iteradores reversos para imprimir os elementos na ordem inversa, um por linha. Em seguida, use std::find com iteradores normais para verificar se "laranja" está na lista e imprima "encontrado" ou "nao encontrado".
Requisitos
- Usar
std::list<std::string>com as frutas indicadas. - Imprimir a lista em ordem reversa usando
rbegin()erend(). - Usar
std::findcombegin()eend()para procurar"laranja". - Imprimir
"encontrado"se a fruta existir, senão"nao encontrado".
Código inicial
#include <iostream>
#include <list>
#include <string>
#include <algorithm>
int main() {
std::list<std::string> frutas{"maçã", "banana", "laranja", "uva"};
// Seu código aqui
return 0;
}
Saída esperada
uva
laranja
banana
maçã
encontrado
Ver dica
Para iteradores reversos, use auto rit = frutas.rbegin(); rit != frutas.rend(); ++rit. Para a busca, compare o retorno de std::find com frutas.end().
Mostrar solução
#include <iostream>
#include <list>
#include <string>
#include <algorithm>
int main() {
std::list<std::string> frutas{"maçã", "banana", "laranja", "uva"};
// Percorre a lista de trás para frente com iteradores reversos
for (auto rit = frutas.rbegin(); rit != frutas.rend(); ++rit) {
std::cout << *rit << '\n';
}
// Busca "laranja" usando iteradores normais
auto it = std::find(frutas.begin(), frutas.end(), "laranja");
if (it != frutas.end()) {
std::cout << "encontrado\n";
} else {
std::cout << "nao encontrado\n";
}
return 0;
}
Passo a passo
- Criamos um
std::list<std::string>com as quatro frutas. - O primeiro laço usa
frutas.rbegin()efrutas.rend()para percorrer a lista do último ao primeiro elemento. - A cada iteração,
*ritacessa a fruta atual e a imprime seguida de nova linha. - Depois, chamamos
std::findpassandofrutas.begin()efrutas.end()e o valor"laranja". std::findretorna um iterador para o elemento encontrado oufrutas.end()se não achar.- Comparamos o retorno com
frutas.end()para decidir qual mensagem imprimir.
Por que funciona
Iteradores reversos adaptam a interface de iteração para percorrer o contêiner no sentido inverso. Eles são especialmente úteis quando queremos processar elementos do fim para o começo sem modificar a estrutura. Já std::find é um algoritmo genérico que funciona com qualquer par de iteradores de entrada, demonstrando a flexibilidade do conceito.
Erros comuns
- Usar
frutas.rbegin()comfrutas.end(): os iteradores reversos formam um par próprio (rbegin/rend). Misturar combegin/endcausa erro de compilação. - Esquecer de comparar com
frutas.end(): sestd::findnão encontrar, o iterador retornado não deve ser desreferenciado; comparar comend()evita isso. - Assumir que
std::listtem iteradores de acesso aleatório:std::listfornece iteradores bidirecionais, entãorit + 1não compila. Use++ou--.
Outra forma de resolver
Poderia-se usar std::for_each com uma lambda para imprimir, mas o laço explícito com iteradores reversos é mais didático e igualmente idiomático.
Saída esperada
uva
laranja
banana
maçã
encontrado