Шаг 266.
Библиотека STL.
Алгоритмы STL. Алгоритм 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;
}


// Объект функции прибавляет к значению элемента приращение,
// заданное при его инициализации
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()));   // Операция

    На следующем шаге мы закончим изучение этого вопроса.




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