На этом шаге мы начнем рассмотривать использование алгоритма for_each.
Алгоритм for_each() обладает чрезвычайно гибкими возможностями. С его помощью можно производить разнообразную обработку и модификацию каждого элемента.
UnaryProc for_each (InputIterator beg, InputIterator end, UnaryProc op)
Вызывает унарный предикат op(elem) для каждого элемента elem в интервале [beg,end). Возвращает копию ор (измененную в процессе выполнения). Операция ор может модифицировать элементы. На 257 шаге алгоритм for_each() сравнивается с алгоритмом transform(), который решает ту же задачу, но несколько иным способом.
Возвращаемые значения ор игнорируются.
Сложность линейная (numberOfElements вызовов ор).
В следующем примере алгоритм for_each() вызывает для каждого элемента функцию print(), которая выводит текущее значение элемента.
//--------------------------------------------------------------------------- #include <vcl.h> #include "algostuff.hpp" #include <conio.h> //необходимо для getch() #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused using namespace std; std::string ToRus(const std::string &in) { char *buff = new char [in.length()+1]; CharToOem(in.c_str(),buff); std::string out(buff); delete [] buff; return out; } // Функция, вызываемая для каждого элемента void print (int elem) { cout << elem << ' '; } int main() { vector<int> coll; INSERT_ELEMENTS(coll,1,9); // Вывод элементов cout << ToRus("Вывод элементов:\n"); for_each (coll.begin(), coll.end(), // Интервал print); // Операция cout << endl; getch(); return 0; } //---------------------------------------------------------------------------
Программа выводит следующий результат:
Рис.1. Результат работы приложения
Чтобы вызвать для каждого элемента функцию его класса, необходимо использовать адаптеры mem_fun.
На следующем шаге мы продолжим изучение этого вопроса.