Шаг 285.
Библиотека STL. Алгоритмы STL. Модифицирующие алгоритмы. Комбинирование элементов двух интервалов

    На этом шаге мы рассмотрим использование второй формы алгоритма 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. Результат работы приложения

    На следующем шаге мы рассмотрим обмен интервалов.




Предыдущий шаг Содержание Следующий шаг