Fácil C++

Ordenar e encontrar o primeiro par

Enunciado

Dado um vetor de inteiros, ordene-o em ordem crescente e use std::find_if para encontrar o primeiro número par. Imprima o vetor ordenado e o primeiro par encontrado (ou uma mensagem se não houver).

Requisitos

  • Use std::sort para ordenar o vetor.
  • Use std::find_if com um lambda que verifica se o número é par.
  • Imprima o vetor ordenado separado por espaços.
  • Imprima o primeiro par ou 'Nenhum par' se não existir.

Código inicial

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> nums = {7, 3, 8, 1, 6, 2};
    // TODO: ordene e encontre o primeiro par
    return 0;
}

Saída esperada

Ordenado: 1 2 3 6 7 8 
Primeiro par: 2
Ver dica

O predicado para par é [](int n) { return n % 2 == 0; }.

Mostrar solução
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> nums = {7, 3, 8, 1, 6, 2};

    // Ordena em ordem crescente
    std::sort(nums.begin(), nums.end());

    std::cout << "Ordenado: ";
    for (int n : nums) std::cout << n << ' ';
    std::cout << '\n';

    // Procura o primeiro número par
    auto it = std::find_if(nums.begin(), nums.end(),
                           [](int n) { return n % 2 == 0; });

    if (it != nums.end())
        std::cout << "Primeiro par: " << *it << '\n';
    else
        std::cout << "Nenhum par\n";

    return 0;
}

Passo a passo

  1. Incluímos <algorithm> para ter acesso a std::sort e std::find_if.
  2. std::sort(nums.begin(), nums.end()) ordena o vetor em ordem crescente usando o operador < padrão.
  3. Imprimimos o vetor ordenado com um laço for baseado em intervalo.
  4. std::find_if recebe o intervalo e um lambda que retorna true para números pares.
  5. O iterador it aponta para o primeiro par encontrado ou para nums.end() se não houver.
  6. Verificamos se it é diferente de end() e imprimimos o valor ou a mensagem de ausência.

Por que funciona

std::sort reorganiza os elementos no próprio vetor, garantindo que a busca subsequente percorra os números em ordem. std::find_if percorre o intervalo e para no primeiro elemento que satisfaz o predicado, retornando um iterador válido. Essa combinação é eficiente e evita escrever laços manuais com índices.

Erros comuns

  • Esquecer de incluir <algorithm>: o compilador não encontra std::sort e std::find_if.
  • Usar *it sem verificar se it != nums.end(): comportamento indefinido se nenhum par existir.
  • Escrever o predicado como n % 2 = 0 (atribuição) em vez de n % 2 == 0 (comparação).

Outra forma de resolver

Se você quisesse apenas verificar a existência de um par, poderia usar std::any_of. Mas para obter o valor, find_if é mais direto.

Saída esperada

Ordenado: 1 2 3 6 7 8 
Primeiro par: 2