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() e rend().
  • Usar std::find com begin() e end() 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

  1. Criamos um std::list<std::string> com as quatro frutas.
  2. O primeiro laço usa frutas.rbegin() e frutas.rend() para percorrer a lista do último ao primeiro elemento.
  3. A cada iteração, *rit acessa a fruta atual e a imprime seguida de nova linha.
  4. Depois, chamamos std::find passando frutas.begin() e frutas.end() e o valor "laranja".
  5. std::find retorna um iterador para o elemento encontrado ou frutas.end() se não achar.
  6. 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() com frutas.end(): os iteradores reversos formam um par próprio (rbegin/rend). Misturar com begin/end causa erro de compilação.
  • Esquecer de comparar com frutas.end(): se std::find não encontrar, o iterador retornado não deve ser desreferenciado; comparar com end() evita isso.
  • Assumir que std::list tem iteradores de acesso aleatório: std::list fornece iteradores bidirecionais, então rit + 1 nã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