accumulate() and partial_sum() in C++ STL : Numeric header
The numeric header is part of the numeric library in C++ STL. This library consists of basic mathematical functions and types, as well as optimized numeric arrays and support for random number generation. Some of the functions in the numeric header:
- iota
- accumulate
- reduce
- inner_product
- partial_sum etc.
This article explains accumulate() and partial_sum() in the numeric header which can be used during competitive programming to save time and effort.
1) accumulate(): This function returns the sum of all the values lying in a range between [first, last) with the variable sum. We usually find out the sum of elements in a particular range or a complete array using a linear operation which requires adding all the elements in the range one by one and storing it into some variable after each iteration.
Syntax:
accumulate(first, last, sum);
or
accumulate(first, last, sum, myfun);
Parameters:
- first, last: first and last elements of range whose elements are to be added
- sum: initial value of the sum
- myfun: a function for performing any specific task.
For example, we can find the product of elements between the first and last.
CPP
#include <iostream>
#include <numeric>
using namespace std;
int myfun( int x, int y)
{
return x * y;
}
int main()
{
int sum = 1;
int a[] = { 5, 10, 15 };
cout << "\nResult using accumulate: " ;
cout << accumulate(a, a + 3, sum);
cout << "\nResult using accumulate with"
"user-defined function: " ;
cout << accumulate(a, a + 3, sum, myfun);
cout << "\nResult using accumulate with "
"pre-defined function: " ;
cout << accumulate(a, a + 3, sum, std::minus< int >());
return 0;
}
|
Output
Result using accumulate: 31
Result using accumulate withuser-defined function: 750
Result using accumulate with pre-defined function: -29
Note: For adding larger values beyond the int range the sum should be initialized with 0ll or a user-defined sum with the suffix ll, else the sum will be overflown. (here ll refers to long long int)
Example: accumulate(a,a+n,0ll)
See this Example Problem for more reference: Sum of all elements between k1’th and k2’th smallest elements
2) partial_sum( ): This function assigns a partial sum of the corresponding elements of an array to every position of the second array. It returns the partial sum of all the sets of values lying between [first, last) and stores it in another array b.
For example, if x represents an element in [first, last) and y represents an element in the result, the ys can be calculated as:
y0 = x0
y1 = x0 + x1
y2 = x0 + x1 + x2
y3 = x0 + x1 + x2 + x3
y4 = x0 + x1 + x2 + x3 + x4
Syntax:
partial_sum(first, last, b);
or
partial_sum(first, last, b, myfun);
Parameters:
- first, last: first and last element of the range whose elements are to be added
- b: index of array where corresponding partial sum will be stored
- myfun: a user-defined function for performing any specific task
CPP
#include <iostream>
#include <numeric>
using namespace std;
int myfun( int x, int y)
{
return x + 2 * y;
}
int main()
{
int a[] = { 1, 2, 3, 4, 5 };
int b[5];
partial_sum(a, a + 5, b);
cout << "Partial Sum - Using Default function: " ;
for ( int i = 0; i < 5; i++)
cout << b[i] << ' ' ;
cout << '\n' ;
partial_sum(a, a + 5, b, myfun);
cout << "Partial sum - Using user defined function: " ;
for ( int i = 0; i < 5; i++)
cout << b[i] << ' ' ;
cout << '\n' ;
return 0;
}
|
Output
Partial Sum - Using Default function: 1 3 6 10 15
Partial sum - Using user defined function: 1 5 11 19 29
Explanation of code :
without myfun:
simply, ith element of a array + i-1th element of array b makes equal to ith element of b
i.e. b[i]=a[i]+b[i-1]
b[0] =1+no ele=> 1
b[1] =2+1=> 3
b[2]= 3+3=> 6
b[3]=6+4=10 and so on
with myfun:
in the same way :
b[i]=b[i-1]+2*a[i]
means b[0] = 1 (Since b[0-1], i.e. (b[-1]) cannot be defined in an array, we will initialize b[0] with the default value of a[0] only)
b[1] = 1+2*2 => 5
b[2] = 5+3*2 => 11
b[3] = 11+4*2 => 19
b[4] = 19 + 5*2 => 29
This article is contributed by Abhinav Tiwari.
Last Updated :
08 Nov, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...