Narzędzia użytkownika

Narzędzia witryny


for_each

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<algorithm> 

Deklaracja for_each

 template<class InputIterator, class UnaryProc>
	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<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;
for_each.txt · ostatnio zmienione: 2008/12/06 19:15 przez pzubrycki