На этом шаге мы еще один пример использования алгоритма 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; } // Объект функции прибавляет к значению элемента приращение, // заданное при его инициализации template <class T> class AddValue { private: T theValue; // Приращение public: // Конструктор инициализирует приращение AddValue (const T& v) : theValue(v) { } // Суммирование выполняется "вызовом функции" для элемента void operator() (T& elem) const { elem += theValue; } }; int main() { vector<int> coll; INSERT_ELEMENTS(coll,1,9); // Вывод исходного вектора; PRINT_ELEMENTS(coll,"Исходный вектор:\n"); // Прибавить к каждому элементу 10 for_each (coll.begin(), coll.end(), // Интервал AddValue<int>(10)); // Операция PRINT_ELEMENTS(coll,"Прибавили к каждому элементу 10:\n"); // Прибавить к каждому элементу значение первого элемента for_each (coll.begin(), coll.end(), // Интервал AddValue<int>(*coll.begin())); // Операция PRINT_ELEMENTS(coll,"Прибавили к каждому элементу значение 1-го элемента:\n"); getch(); return 0; } //---------------------------------------------------------------------------
Класс AddValue() определяет объекты функций, которые прибавляют к каждому элементу приращение, переданное при вызове конструктора. Используя объект функции, вы сможете определить величину приращения на стадии выполнения программы. Результат выполнения программы выглядит так:
Рис.1. Результат работы приложения
Задача также решается при помощи алгоритма transform():
transform (coll.begin(), coll.end(), // Источник coll.begin(), // Приемник bind2nd(plus<int>(),10)); // Операция transform (coll.begin(),coll.end(), // Источник coll.begin(), // Приемник bind2nd(plus<int>(),*coll.begin())); // Операция
На следующем шаге мы закончим изучение этого вопроса.