Médio C++

Transformar e somar quadrados

Enunciado

Dado um vetor de inteiros, crie um novo vetor com o quadrado de cada elemento usando std::transform e depois use std::accumulate para calcular a soma dos quadrados. Imprima o vetor de quadrados e a soma.

Requisitos

  • Use std::transform para gerar o vetor de quadrados.
  • Use std::accumulate para somar os quadrados.
  • Imprima os quadrados separados por espaço.
  • Imprima a soma no formato 'Soma dos quadrados: X'.

Código inicial

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

int main() {
    std::vector<int> nums = {1, 2, 3, 4};
    // TODO: transforme e acumule
    return 0;
}

Saída esperada

Quadrados: 1 4 9 16 
Soma dos quadrados: 30
Ver dica

O lambda de transformação pode ser [](int n) { return n * n; }.

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

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

    // Vetor para armazenar os quadrados
    std::vector<int> quadrados(nums.size());

    // Aplica n * n a cada elemento
    std::transform(nums.begin(), nums.end(), quadrados.begin(),
                   [](int n) { return n * n; });

    std::cout << "Quadrados: ";
    for (int q : quadrados) std::cout << q << ' ';
    std::cout << '\n';

    // Soma todos os quadrados, começando de 0
    int soma = std::accumulate(quadrados.begin(), quadrados.end(), 0);

    std::cout << "Soma dos quadrados: " << soma << '\n';

    return 0;
}

Passo a passo

  1. Incluímos <numeric> porque std::accumulate está nesse cabeçalho.
  2. Criamos quadrados com o mesmo tamanho de nums para receber os resultados.
  3. std::transform percorre nums, aplica o lambda n * n e grava em quadrados.begin().
  4. Imprimimos o vetor de quadrados com um laço baseado em intervalo.
  5. std::accumulate soma todos os elementos de quadrados partindo do valor inicial 0.
  6. Exibimos a soma final.

Por que funciona

std::transform é uma operação de mapeamento: para cada elemento de entrada, produz um elemento de saída. std::accumulate é uma redução: combina todos os elementos em um único valor usando +. Juntos, eles expressam claramente a intenção de 'elevar ao quadrado e somar' sem laços explícitos.

Erros comuns

  • Esquecer de incluir <numeric>: std::accumulate não é encontrado.
  • Passar um vetor de destino menor que a entrada: transform escreve além do fim, causando comportamento indefinido.
  • Usar std::accumulate com tipo inicial 0 e valores muito grandes: pode haver overflow; nesse caso, use 0LL para long long.

Outra forma de resolver

Você pode combinar transformação e soma em uma única passada usando std::accumulate com um lambda que soma quadrados, mas isso mistura conceitos. A separação em duas etapas é mais didática.

Saída esperada

Quadrados: 1 4 9 16 
Soma dos quadrados: 30