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::transformpara gerar o vetor de quadrados. - Use
std::accumulatepara 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
- Incluímos
<numeric>porquestd::accumulateestá nesse cabeçalho. - Criamos
quadradoscom o mesmo tamanho denumspara receber os resultados. std::transformpercorrenums, aplica o lambdan * ne grava emquadrados.begin().- Imprimimos o vetor de quadrados com um laço baseado em intervalo.
std::accumulatesoma todos os elementos dequadradospartindo do valor inicial0.- 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::accumulatenão é encontrado. - Passar um vetor de destino menor que a entrada:
transformescreve além do fim, causando comportamento indefinido. - Usar
std::accumulatecom tipo inicial0e valores muito grandes: pode haver overflow; nesse caso, use0LLparalong 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