std::accumulate

From Cppreference

Jump to: navigation, search
Defined in header <numeric>

template< class InputIterator, class T >
T accumulate( InputIterator first, InputIterator last, T init );
(1)
template< class InputIterator, class T, class BinaryOperation >

T accumulate( InputIterator first, InputIterator last, T init,

              BinaryOperation op );
(2)

Computes the sum of the given value init and the elements in the range [first, last). The first version uses operator+ to sum up the elements, the second version uses the given binary function op.

Contents

[edit] Parameters

first, last - the range of elements to sum
init - initial value of the sum
op - binary operation function object that will be applied.

The signature of the function should be equivalent to the following:

​Ret fun(const Type1 &a, const Type2 &b);

The signature does not need to have const &.
The type ​Type1​ must be such that an object of type ​T​ can be implicitly converted to ​Type1​. The type ​Type2​ must be such that an object of type ​InputIterator​ can be dereferenced and then implicitly converted to ​Type2​. The type ​Ret​ must be such that an object of type ​T​ can be assigned a value of type ​Ret​. ​

[edit] Return value

The sum of the given value and elements in the given range.

[edit] Equivalent function

First version:
template<class InputIterator, class T>
T accumulate(InputIterator first, InputIterator last, T value)
{
    for (; first != last; ++first) {
        value = value + *first;
    }
    return value;
}
Second version:
template<class InputIterator, class T, class BinaryOperation>
T accumulate(InputIterator first, InputIterator last, T value, BinaryOperation op)
{
    for (; first != last; ++first) {
        value = op( value, *first );
    }
    return value;
}

[edit] Example

#include <iostream>
#include <vector>
#include <numeric>
#include <string>
 
int multiply(int x, int y)
{
    return x*y;
}
 
std::string magic_function(std::string res, int x)
{
    if (x > 5) {
         res += "b";
    } else {
         res += "s";
    }
    return res;
}
 
int main()
{
    int data[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    std::vector<int> v(data, data+10);
 
    int sum = std::accumulate(v.begin(), v.end(), 0);
    int product = std::accumulate(v.begin(), v.end(), 1, multiply);
    std::string magic = std::accumulate(v.begin(), v.end(), std::string(), magic_function);
 
    std::cout << sum << std::endl
              << product << std::endl
              << magic << std::endl;
    return 0;
}

Output:

​55
3628800
sssssbbbbb​

[edit] See also

adjacent_difference
computes the differences between adjacent elements in a range
(function template)
inner_product
computes the inner product of two ranges of elements
(function template)
partial_sum
computes the partial sum of a range of elements
(function template)
Personal tools
Namespaces
Variants
Actions
Navigation
Toolbox
In other languages