====== 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;