На этом шаге мы рассмотрим использование второй формы алгоритма transform().
Общий вид второй формы алгоритма transform() следующий:
OutputIterator transform (InputIterator1 sourceBeg, InputIterator1 sourceEnd, Inputlterator2 source2Beg, OutputIterator destBeg, BinaryFunc op)
Вызывает предикат op(souce1Elem,source2Elem) для каждой пары соответствующих элементов интервалов [source1Beg,source1End) и [source2Beg,...) и записывает каждый результат в приемный интервал, начиная с позиции destBeg:
Рис.1. Схема выполнения алгоритма
Возвращает позицию за последним преобразованным элементом в приемном интервале (то есть позицию первого элемента, не перезаписанного в результате операции).
Перед вызовом необходимо убедиться в том, что второй источник имеет достаточный размер (то есть содержит не меньше элементов, чем первый источник).
Перед вызовом необходимо убедиться в том, что приемный интервал имеет достаточный размер, или использовать итераторы вставки.
Позиции source1Beg, source2Beg и destBeg могут быть идентичными. Это означает, что вы можете вычислить комбинацию элементов самих с собой и записать результат на то же место.
Сложность линейная (numberOfElements вызовов ор()).
Следующая программа демонстрирует использование данной формы алгоритма transform():
//--------------------------------------------------------------------------- #include <vcl.h> #include <iterator> #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; } int main() { vector<int> coll1; list<int> coll2; INSERT_ELEMENTS(coll1,1,9); PRINT_ELEMENTS(coll1,"1-я коллекция:\n"); // Возведение элементов в квадрат transform (coll1.begin(), coll1.end(), // Первый источник coll1.begin(), // Второй источник coll1.begin(), // Приемник multiplies<int>()); // Операция PRINT_ELEMENTS(coll1,"1-я коллекция (возвели в квадрат):\n"); // Сложить каждый элемент в порядке прямого перебора // с соответствующим элементом в порядке обратного перебора // и вставить результат в coll2 transform (coll1.begin(), coll1.end(), // Первый источник coll1.rbegin(), // Второй источник back_inserter(coll2), // Приемник plus<int>()); // Операция PRINT_ELEMENTS(coll2,"2-я коллекция:\n"); // Вывод разностей соответствующих элементов cout << ToRus("Разности:\n"); transform (coll1.begin(), coll1.end(), // Первый источник coll2.begin(), // Второй источник ostream_iterator<int>(cout, " "), // Приемник minus<int>()); // Операция cout << endl; getch(); return 0; } //---------------------------------------------------------------------------
Результат выполнения программы выглядит так:
Рис.2. Результат работы приложения
На следующем шаге мы рассмотрим обмен интервалов.