accumulate |
C++ Library |
template<class InputIterator, class _TYPE> inline _TYPE accumulate(InputIterator first, InputIterator last, _TYPE init)
template<class InputIterator, class _TYPE, class BinaryOperator> inline _TYPE accumulate(InputIterator first, InputIterator last, _TYPE init, BinaryOperator binary_op)
accumulate repeatedly applies a function for each member of the input sequence, storing the result in a temporary storage.
The accumulate function initializes an accumulator acc with an 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. Normally, the accumulate function is used to sum the numeric elements of a vector. However, it can also be used to do other useful work such as concatenating a vector of strings.
// disable warning about symbols too long for debugger #pragma warning (disable : 4786) #include <iostream> #include <numeric> #include <functional> #include <vector> #include <iterator> #include <string> using namespace std; typedef vector < float > FloatArray; typedef vector < string > StringArray; typedef ostream_iterator <float, char, char_traits <char> > FloatOstreamIt; void main () { // a vector of floats FloatArray rgFA; // an ostream iterator that outputs a float to cout terminated // by a space FloatOstreamIt OstreamIt(cout," "); // Initialize the array to 1,1/2,1/3,... for (int i=0; i<10; i++) rgFA.push_back(1.0f/(i+1)); // Print the array copy(rgFA.begin(),rgFA.end(),OstreamIt); cout << endl; // Sum the array cout << "The sum of 1 + 1/2 + 1/3 + ... + 1/10 is " << accumulate(rgFA.begin(),rgFA.end(),0.0f) << endl; // Compute the product of the array cout << "The product of 1 * 1/2 * 1/3 * ... * 1/10 is " << accumulate(rgFA.begin(),rgFA.end(),1.0f,multiplies<float>()) << endl; // Initialize array of strings StringArray rgs; rgs.push_back("This "); rgs.push_back("is "); rgs.push_back("one "); rgs.push_back("sentence. "); // Concatenate the strings in the array and print the sentence cout << "The concatenated vector of strings: " << accumulate(rgs.begin(),rgs.end(),string("")) << endl; }
1 0.5 0.333333 0.25 0.2 0.166667 0.142857 0.125 0.111111 0.1 The sum of 1 + 1/2 + 1/3 + ... + 1/10 is 2.92897 The product of 1 * 1/2 * 1/3 * ... * 1/10 is 2.75573e-007 The concatenated vector of strings: This is one sentence.