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

*Effects:*
Computes its result by initializing the accumulator
acc
with the initial value
init
and then modifies it with
acc = acc + *i
or
acc = binary_op(acc, *i)
for every iterator
i
in the range [first,last)
in order.289

*Requires:*
T shall meet the requirements of CopyConstructible (Table [copyconstructible])
and CopyAssignable (Table [copyassignable]) types.
In the range
[first,last],
binary_op
shall neither modify elements nor invalidate iterators or subranges.290

accumulate is similar to the APL reduction operator and Common Lisp reduce function, but it avoids the difficulty of defining the result of reduction on an empty sequence by always requiring an initial value.

The use of fully closed ranges is intentional