[ create a new paste ] login | about

Link: http://codepad.org/rqKxiifX    [ raw code | output | fork ]

arunksaha - C++, pasted on Oct 11:
// Implementing accumulate with for_each
// See: http://stackoverflow.com/questions/3906796/how-to-fold-stl-container
// Arun Saha, 2010-Oct-11
#include <numeric>
#include <iostream>
#include <algorithm>
#include <cassert>
using namespace std;

struct result_functor {
    result_functor( int initial, int multiplier ) :
        result_( initial ), multiplier_( multiplier ) {
    }
    int operator()( int x ) {
        result_ += multiplier_ * x;
        return result_;
    }
    int result_;
    int multiplier_;
};

int myfunction (int x, int y) {
    return x + 2 * y;
}

struct myclass {
	int operator()(int x, int y) const {
        return x + 3 * y;
    }
} myobject;

int main() {

    const int init = 100;
    const int numbers[] = { 10, 20, 30 };
    
    const int accum_sum = std::accumulate( numbers, numbers + 3, init );
    cout << accum_sum << endl;
    const result_functor for_sum = for_each( numbers, numbers + 3, result_functor( init, +1 ) );
    cout << for_sum.result_ << endl;
    assert( accum_sum == for_sum.result_ );

    const int accum_minus = std::accumulate( numbers, numbers + 3, init, minus<int>() );
    cout << accum_minus << endl;
    const result_functor for_minus = for_each( numbers, numbers + 3, result_functor( init, -1 ) );
    cout << for_minus.result_ << endl;
    assert( accum_minus == for_minus.result_ );

    const int myfunction_result = std::accumulate( numbers, numbers + 3, init, myfunction );
    cout << myfunction_result << endl;
    const result_functor for_myfunction = for_each( numbers, numbers + 3, result_functor( init, +2 ) );
    cout << for_myfunction.result_ << endl;
    assert( myfunction_result == for_myfunction.result_ );

    const int myobject_result = std::accumulate( numbers, numbers + 3, init, myobject );
    cout << myobject_result << endl;
    const result_functor for_myobject = for_each( numbers, numbers + 3, result_functor( init, +3 ) );
    cout << for_myobject.result_ << endl;
    assert( myobject_result == for_myobject.result_ );

}


Output:
1
2
3
4
5
6
7
8
160
160
40
40
220
220
280
280


Create a new paste based on this one


Comments: