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

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

    Для выполнения указанных действий используют следующие алгоритмы:

  OutputIterator
  replace_copy (InputIterator sourceBeg, InputIterator sourceEnd,
                OutputIterator destBeg,
                const T& oldValue, const T& newValue)
  OutputIterator
  replace_copy_if (InputIterator sourceBeg, InputIterator sourceEnd,
                   OutputIterator destBeg,
                   UnaryPredicate op, const T& newValue)

    Алгоритм replace_copy() является объединением алгоритмов сору() и replace(). Он заменяет каждый элемент интервала [beg,end), равный oldValue, значением newValue в процессе копирования элементов в приемный интервал, начинающийся с позиции destBeg.

    Алгоритм replace_copy_if() является объединением алгоритмов сору() и replace_if(). Он заменяет каждый элемент интервала [beg,end), для которого унарный предикат op(elem) возвращает true, значением newValue. Замена производится в процессе копирования элементов в приемный интервал, начинающийся с позиции destBeg.

    Оба алгоритма возвращают позицию за последним скопированным элементом в приемном интервале (то есть позицию первого элемента, который не был заменен в ходе копирования).

    Предикат ор не должен изменять свое состояние во время вызова.

    Перед вызовом необходимо убедиться в том, что приемный интервал имеет достаточный размер, или использовать итераторы вставки.

    Сложность линейная (numberOfElements сравнений или вызовов ор и присваиваний соответственно).

    Пример использования алгоритмов replace_copy() и replace_copy_if():

//---------------------------------------------------------------------------

#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()
{
  list<int> coll;

  INSERT_ELEMENTS(coll,2,6);
  INSERT_ELEMENTS(coll,4,9);
  PRINT_ELEMENTS(coll,"Исходная коллекция:\n");

  // Вывод коллекции, в которой все элементы, равные 5,
  // заменены значением 55
  cout << ToRus("Вывод после замены 5 на 55:\n");
  replace_copy(coll.begin(), coll.end(),           // Источник
               ostream_iterator<int>(cout," "),    // Приемник
               5,                                  // Старое значение
               55);                                // Новое значение
  cout << endl;

  // Вывод коллекции, в которой все элементы, меньшие 5,
  // заменены значением 42
  cout << ToRus("Вывод после замены элементов, меньших 5, на 42:\n");
  replace_copy_if(coll.begin(), coll.end(),        // Источник
                  ostream_iterator<int>(cout," "), // Приемник
                  bind2nd(less<int>(),5),     // Критерий замены
                  42);                        // Новое значение
  cout << endl;

  // Вывод коллекции, в которой все нечетные элементы заменены нулями
  cout << ToRus("Вывод после замены всех нечетных элементов нулями:\n");
  replace_copy_if(coll.begin(), coll.end(),        // Источник
                  ostream_iterator<int>(cout," "), // Приемник
                  bind2nd(modulus<int>(),2),  // Критерий замены
                  0);                         // Новое значение
  cout << endl;


  getch();
  return 0;
}

//---------------------------------------------------------------------------
Текст этого примера можно взять здесь.

    Результат выполнения программы выглядит так:


Рис.1. Результат работы приложения

    Со следующего шага мы начнем рассматривать алгоритмы удаления.




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