Calcule a soma do Array em C++
-
Use a função
std::acumular
para calcular a soma dos elementos do array em C++ -
Use a função
std::partial_sum
para calcular somas parciais de subarrays em C++
Este artigo explicará vários métodos de como calcular a soma dos elementos do array em C++.
Use a função std::acumular
para calcular a soma dos elementos do array em C++
std::accumulate
faz parte das funções numéricas incluídas na biblioteca STL sob o arquivo de cabeçalho <numeric>
. std::accumulate
é uma função genérica que funciona nos elementos no intervalo dado, que é especificado pelos dois primeiros argumentos representados pelos iteradores correspondentes. O terceiro argumento é utilizado para passar o valor inicial da soma, que pode ser o valor literal do objeto. Neste caso, demonstramos um array dinâmico de inteiros armazenados no contêiner std::vector
. Observe que std::accumulate
pode opcionalmente receber o quarto argumento de um tipo de objeto de função binária para substituir a operação de adição. A segunda chamada para std::accumulate
no próximo código de exemplo demonstra tal cenário, com a única diferença de que a multiplicação é usada como uma operação binária.
#include <iostream>
#include <numeric>
#include <vector>
using std::accumulate;
using std::cin;
using std::cout;
using std::endl;
using std::vector;
template <typename T>
void printVector(vector<T> &vec) {
for (const auto &item : vec) {
cout << item << ", ";
}
cout << endl;
}
int main() {
vector<int> arr1 = {1, 12, 13, 10, 11};
printVector(arr1);
int arr1_sum = accumulate(arr1.begin(), arr1.end(), 0);
cout << "sum of arr1 = " << arr1_sum << endl;
int arr1_product =
accumulate(arr1.begin(), arr1.end(), 1, std::multiplies<>());
cout << "product of arr1 = " << arr1_product << endl;
return EXIT_SUCCESS;
}
Resultado:
1, 12, 13, 10, 11,
sum of arr1 = 47
product of arr1 = 17160
Use a função std::partial_sum
para calcular somas parciais de subarrays em C++
Outra função numérica útil fornecida pelo mesmo arquivo de cabeçalho é std::partial_sum
, que soma os subfaixas no intervalo dado. A função oferece uma interface semelhante à anterior, exceto que o terceiro argumento deve ser o iterador inicial do intervalo onde os números calculados serão armazenados. Nesse caso, substituímos os elementos vetoriais existentes com os resultados somados. Observe que a operação binária personalizada também pode ser especificada com std::partial_sum
para alterar a opção padrão - adição.
#include <iostream>
#include <numeric>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
template <typename T>
void printVector(vector<T> &vec) {
for (const auto &item : vec) {
cout << item << ", ";
}
cout << endl;
}
int main() {
vector<int> arr1 = {1, 12, 13, 10, 11};
printVector(arr1);
std::partial_sum(arr1.begin(), arr1.end(), arr1.begin());
printVector(arr1);
std::partial_sum(arr1.begin(), arr1.end(), arr1.begin(), std::multiplies());
printVector(arr1);
return EXIT_SUCCESS;
}
Resultado:
1, 13, 26, 36, 47,
1, 13, 338, 12168, 571896,
Alternativamente, essas funções também podem ser utilizadas para conduzir operações bit a bit entre os elementos em um determinado intervalo. Por exemplo, o fragmento de código a seguir XORs os elementos vector
e armazena os valores de resultado no mesmo intervalo.
#include <iostream>
#include <numeric>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
template <typename T>
void printVector(vector<T> &vec) {
for (const auto &item : vec) {
cout << item << ", ";
}
cout << endl;
}
int main() {
vector<int> arr1 = {1, 12, 13, 10, 11};
printVector(arr1);
std::partial_sum(arr1.begin(), arr1.end(), arr1.begin(), std::bit_xor());
printVector(arr1);
return EXIT_SUCCESS;
}
Resultado:
1, 13, 0, 10, 1,
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook