Accumulare i valori in un container
La STL fornisce la funzione generica accumulate che consente di accumulare, ad un valore iniziale, gli elementi di una sequenza. L’operazione di default è la somma degli elementi. Può essere comunque utilizzata una funzione binaria:
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 );
dove first e last rappresentano l’inizio e la fine della sequenza, init è il valore iniziale mentre binary_op è una funzione binaria.
#include <iostream> #include <numeric> using namespace std; class square { public: int operator()(int x, int y){ return x + y*y; } }; int cube(int x, int y) { return x + y*y*y; } int main() { const int size = 8; square squarefun; int accumulator = 0; int array[8]; for(int i = 0; i < size; i++) array[i] = i+1; cout << "Somma dei primi " << size << " naturali: " << accumulate(array, array+size, accumulator) << endl; cout << "Somma dei primi " << size << " quadrati: " << accumulate(array, array+size, accumulator, squarefun) << endl; cout << "Somma dei primi " << size << " cubi: " << accumulate(array, array+size, accumulator, &cube) << endl; }
in questo esempio effettuiamo la somma dei primi 8 naturali, poi, utilizzando una funzione e un oggetto, sommiamo i primi 8 quadrati e cubi.