Algorytm for_each umożliwia dostęp, przetworzenie i modyfikację każdego elementu kontenera, w tym również zwykłej tablicy. Zaliczany jest do algorytmów niemodyfikujących, ale może być też zaliczany do algorytmów modyfikujących. Algorytm for_each jest używany zamiast pętli for, aby uzwięźlić i poprawić czytelność kodu przy iteracji przez kontenery. Jego użycie jednoznacznie określa intencje autora i ogranicza rozwlekłość kodu.
#include<algorithm>
template<class InputIterator, class UnaryProc> UnaryProc for_each(InputIterator begin, InputIterator end, UnaryProc operation)
Kopia operation. Jeśli operation było obiektem funkcyjnym zmieniającym stan podczas iteracji, for_each zwróci ten obiekt po przetworzeniu.
Wywołuje operation(elem) dla każdego elementu z zakresu [begin, end). operation może być zwykłym wskaźnikiem na funkcję, jak i obiektem funkcyjnym. Algorytm po przetworzeniu zwraca operation.
Definicja obiektu funkcyjnego ze stanem:
class Weighted_mean{ double value_; unsigned int n_; public: Weighted_mean(): value_(0.0), n_(0){} void operator()(pair<unsigned int, double> factor){ value_ += factor.first * factor.second; n_ += factor.first; } operator double(){ if(n_ == 0) return 0.0; return value_/n_; } };
Użycie zdefiniowanego wyżej obiektu w algorytmie for_each:
typedef std::multimap<unsigned int, double> Oceny; Oceny oceny; oceny.insert(Oceny::value_type(2, 5.0));//Oceny::value_type jest równoważne dla std::pair<unsigned int, double> oceny.insert(Oceny::value_type(5, 3.0)); cout << "Średnia: " << double(for_each(oceny.begin(), oceny.end(), Weighted_mean())) << std::endl;