На этом шаге мы рассмотрим алгоритмы, осуществляющие замену при копировании.
Для выполнения указанных действий используют следующие алгоритмы:
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. Результат работы приложения
Со следующего шага мы начнем рассматривать алгоритмы удаления.