Library: Numerics
Function
Generalized numeric operation that calculates successive partial sums of a range of values
#include <numeric>
namespace std {
template <class InputIterator, class OutputIterator>
OutputIterator partial_sum(InputIterator start,
InputIterator finish,
OutputIterator result);
template <class InputIterator,
class OutputIterator,
class BinaryOperation>
OutputIterator partial_sum(InputIterator start,
InputIterator finish,
OutputIterator result,
BinaryOperation binary_op);
}
The partial_sum() algorithm creates a new sequence in which every element is formed by adding all the values of the previous elements, or, in the second form of the algorithm, by applying the operation binary_op successively on every previous element. That is, partial_sum() assigns to every iterator i in the range [result, result + (finish - start)) a value equal to:
((...(*start + *(start + 1)) + ... ) +
*(start + (i - result)))
or, in the second version of the algorithm:
binary_op(binary_op(..., binary_op (*start,
*(start + 1)),...),*(start + (i - result)))
For instance, applying partial_sum() to (1,2,3,4,) yields (1,3,6,10).
The partial_sum() algorithm returns result + (finish - start).
If result is equal to start, the elements of the new sequence successively replace the elements in the original sequence, effectively turning partial_sum() into an inplace transformation.
Exactly (finish - start) - 1 applications of the default + operator or binary_op are performed.
//
// partsum.cpp
//
#include <algorithm> // for copy
#include <functional> // for multiplies
#include <iostream> // for cout, endl
#include <iterator> // for ostream_iterator
#include <numeric> // for partial_sum
#include <vector> // for vector
int main ()
{
typedef std::vector<int, std::allocator<int> > Vector;
typedef std::ostream_iterator<int, char,
std::char_traits<char> >
Iter;
// Initialize a vector using an array of integers.
const Vector::value_type a[] = { 1, 2, 3, 4, 5,
6, 7, 8, 9, 10 };
Vector v (a + 0, a + sizeof a / sizeof *a);
// Create an empty vectors to store results.
Vector sums (Vector::size_type (10));
Vector prods (Vector::size_type (10));
// Compute partial_sums and partial_products.
std::partial_sum (v.begin (), v.end (), sums.begin ());
std::partial_sum (v.begin (), v.end (), prods.begin (),
std::multiplies<Vector::value_type>());
// Output the results.
std::cout << "For the series: \n ";
std::copy (v.begin (), v.end (), Iter (std::cout, " "));
std::cout << "\n\nThe partial sums: \n ";
std::copy (sums.begin (), sums.end (), Iter (std::cout,
" "));
std::cout << " should each equal (N*N + N)/2\n\n";
std::cout << "The partial products: \n ";
std::copy (prods.begin (), prods.end (), Iter (std::cout,
" "));
std::cout << " should each equal N!" << std::endl;
return 0;
}
Program Output:
For the series:
1 2 3 4 5 6 7 8 9 10
The partial sums:
1 3 6 10 15 21 28 36 45 55 should each equal (N*N + N)/2
The partial products:
1 2 6 24 120 720 5040 40320 362880 3628800 should each
equal N!
ISO/IEC 14882:1998 -- International Standard for Information Systems -- Programming Language C++, Section 26.4.3