accumulate, copy, and vector::push_back

Illustrates how to use the accumulate, copy, and vector::push_back Standard Template Library (STL) functions in Visual C++.

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
   )

Remarks

Notes

The class/parameter names in the prototype do not match the version in the header file. Some have been modified to improve readability.

The accumulate STL 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 STL 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.

Example

// accumulate.cpp
// compile with: /EHsc
//
// Description of accumulate(first,last,init)
//                accumulate(first,last,init,binary_op):
//
//    Initializes the accumulator acc with the initial value init
//        acc = 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.

// turn off 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;

int 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;
}

Output

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. 

Requirements

Header: <numeric>

See Also

Concepts

Standard Template Library Samples