На этом шаге мы рассмотрим еще один пример использования алгоритма for_each.
В третьем примере используется значение, возвращаемое алгоритмом for_each(). Особое свойство for_each() - возвращение выполняемой операции - позволяет выполнить необходимые вычисления и вернуть результат в объекте функции.
//--------------------------------------------------------------------------- #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; } // Объект функции для вычисления среднего арифметического class MeanValue { private: long num; // Счетчик элементов long sum; // Сумма всех значений элементов public: // Конструктор MeanValue () : num(0), sum(0) { } // "Вызов функции" // - обработка очередного элемента последовательности void operator() (int elem) { num++; // Увеличение счетчика sum += elem; // Прибавление значения } // Возвращение среднего арифметического // (с неявным преобразованием типа) operator double() { return static_cast<double>(sum) / static_cast<double>(num); } }; int main() { vector<int> coll; INSERT_ELEMENTS(coll,1,8); PRINT_ELEMENTS(coll,"Исходный вектор:\n"); // Вычисление и вывод среднего арифметического double mv = for_each (coll.begin(), coll.end(), // Интервал MeanValue()); // Операция cout << ToRus("Среднее арифметическое: ") << mv << endl; getch(); return 0; } //---------------------------------------------------------------------------
Программа выводит следующий результат:
Рис.1. Результат работы приложения
Со следующего шага мы начнем рассматривать немодифицирующие алгоритмы.