На этом шаге мы рассмотрим другой пример передачи функций в аргументах алгоритмов.
Существует несколько вариантов применения пользовательских функций алгоритмами; в одних случаях передача функция обязательна, в других - нет. В частности, пользовательская функция может определять критерий поиска, критерий сортировки или преобразование, применяемое при копировании элементов из одной коллекции в другую.
Еще пример:
//--------------------------------------------------------------------------- #include <vcl.h> #include <iostream> #include <set> #include <vector> #include <algorithm> #include <conio.h> //необходимо для getch() #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused using namespace std; template <class T> inline void PRINT_ELEMENTS (const T& coll, const char* optcstr="") { typename T::const_iterator pos; std::cout << ToRus(optcstr); for (pos=coll.begin(); pos!=coll.end(); ++pos) { std::cout <<*pos <<' '; } std::cout << std::endl; } 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 square (int value) { return value*value; } int main(int argc, char* argv[]) { std::set<int> coll1; std::vector<int> coll2; // Вставка элементов со значениями от 1 до 9 в coll1 for (int i=1; i<=9; ++i) { coll1.insert(i); } PRINT_ELEMENTS(coll1, "Инициализация:\n"); // Преобразование каждого элемента при копировании из colll в col12 // - square transformed values std::transform (coll1.begin(),coll1.end(), // Источник std::back_inserter(coll2), // Приемник square); // Операция PRINT_ELEMENTS(coll2,"Квадраты:\n"); getch(); return 0; } //---------------------------------------------------------------------------
В приведенном примере функция square() возводит в квадрат каждый элемент coll1 при его копировании в coll2 (рисунок 1). Результат выполнения программы выглядит так:
Рис.1. Результат работы приложения
Работа алгоритма transform() приведена на рисунке 2:
Рис.2. Работа алгоритма transform()
Со следующего шага мы начнем рассматривать предикаты.