====== Algorytm for_each ======
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.
===== Nagłówek =====
#include
===== Deklaracja for_each =====
template
UnaryProc for_each(InputIterator begin, InputIterator end, UnaryProc operation)
===== Parametry =====
* begin - pierwszy element kontenera
* end - element za ostatnim w kontenerze
* operation - operacja wykonywana na elementach kontenera. Może być obiektem funkcyjnym
===== Wartość zwracana =====
Kopia operation. Jeśli operation było obiektem funkcyjnym zmieniającym stan podczas iteracji, for_each zwróci ten obiekt po przetworzeniu.
===== Działanie =====
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.
===== Przykład użycia =====
Definicja obiektu funkcyjnego ze stanem:
class Weighted_mean{
double value_;
unsigned int n_;
public:
Weighted_mean(): value_(0.0), n_(0){}
void operator()(pair 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 Oceny;
Oceny oceny;
oceny.insert(Oceny::value_type(2, 5.0));//Oceny::value_type jest równoważne dla std::pair
oceny.insert(Oceny::value_type(5, 3.0));
cout << "Średnia: " << double(for_each(oceny.begin(), oceny.end(), Weighted_mean())) << std::endl;