Шаблонна функція std::for_each призначена для перебору елементів послідовності, яка обмежена ітераторами, і застосування до кожного вказаної функції. Оголошення даної шаблонної функції виглядає приблизно наступним чином:
template <class InputIterator, class Function>
Function for_each (InputIterator begin, InputIterator end, Function fn) ;
Перші два параметри begin і end являються ітераторами і призначені для обмеження послідовності до якої буде застосована спеціальна функція fn. До слова, параметр fn може являтися функціональним об'єктом.
Приклади
Приклад #1
Розглянемо простий приклад використання функції for_each - створимо функцію, яка просто виводить переданий їй елемент на екран і передамо даному алгоритму масив цілих чисел і створену спеціальну функцію.
#include <algorithm> /* усі корисні алгоритми включно з max_element */
#include <iostream> /* об'єкт cout */
using namespace std ; /* друкуємо усе без std */
/* шаблонна функція, яка виводить переданий їй елемент
** у вікно терміналу плюс крапку з комою і пробіл */
template <typename T> void print_element (T el)
{ cout << el << "; " ; }
/* головна функція програми */
int main (int argc, char** argv)
{
/* створюємо піддослідний масив цілих чисел і визначаємо його довжину */
int iArray [] = {5,6,1,56,7,234,7,8,45,65,87} ;
int iLen = sizeof (iArray)/sizeof(iArray[0]) ;
/* для наглядності повідомляємо користувача,
** що ми виводимо на екран */
cout << "Усі елементи масиву:" << endl ;
/* виводимо елементи на екран */
for_each (iArray, iArray+iLen, print_element<int>) ;
/* друкуємо новий рядок */
cout << endl ;
return 0 ;
}
Вивід програми наступний:
Приклад #2
Розглянемо приклад в якому ми будемо змінювати значення об'єкта класу std::vector, який призначений для зберігання послідовності об'єктів класу std::string.
#include <algorithm> /* усі корисні алгоритми включно з max_element */
#include <vector>
#include <iostream> /* об'єкт cout */
using namespace std ; /* друкуємо усе без std */
/* шаблонна функція, яка в якості параметру отримує тип
** з підтримкою ітераторів і методів begin(), end();
** після чого в послідовності замінює усі елементи з значенням
** пробілу на символ нижнього підкреслення */
template <typename T> void change_spaces_to_underscores (T& el)
{
for (typename T::iterator iter=el.begin(); iter!=el.end(); ++iter)
{
if (*iter==' ')
{ *iter = '_' ; }
}
}
/* головна функція програми */
int main (int argc, char** argv)
{
/* cстворюємо піддослідний вектор для класу string */
vector<string> strs ;
/* заповнюємо значеннями з пробілами */
strs.push_back (string("object 1")) ;
strs.push_back (string("object 2")) ;
strs.push_back (string("object 3")) ;
/* застосовуємо алгоритм for_each з новою функцією */
for_each (strs.begin(), strs.end(), change_spaces_to_underscores<string>) ;
/* виводимо нові значення елементів вектора */
cout << "Нові значення елементів вектора:" << endl ;
for (vector<string>::iterator iter=strs.begin();
iter!=strs.end();
++iter)
{ cout << *iter << endl ; }
return 0 ;
}
Вивід програми: