На этом шаге мы рассмотрим алгоритмы, осуществляющие замену внутри интервала.
Для выполнения указанных действий можно воспользоваться следующими алгоритмами:
void replace (ForwardIterator beg, ForwardIterator end, const T& oldValue, const T& newValue) void replace_if (ForwardIterator beg, ForwardIterator end, UnaryPredicate op, const T& newValue)
Алгоритм replace() заменяет все элементы интервала [beg,end), равные oldValue, значением newValue.
Алгоритм replace_if() заменяет все элементы интервала [beg,end), для которых унарный предикат ор(elem) возвращает true, значением newValue.
Предикат ор не должен изменять свое состояние во время вызова.
Сложность линейная (numberOfElements сравнений или вызовов ор соответственно).
Пример использования алгоритмов replace() и replace_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,7); INSERT_ELEMENTS(coll,4,9); PRINT_ELEMENTS(coll,"Исходный список:\n"); // Замена всех элементов, равных 6, значением 42 replace (coll.begin(), coll.end(), // Интервал 6, // Старое значение 42); // Новое значение PRINT_ELEMENTS(coll,"Список после первой замены:\n"); // Замена всех элементов, меньших 5, значением 0 replace_if (coll.begin(), coll.end(), // Интервал bind2nd(less<int>(),5), // Критерий замены 0); // Новое значение PRINT_ELEMENTS(coll,"Список после второй замены:\n"); getch(); return 0; } //---------------------------------------------------------------------------
Результат выполнения программы выглядит так:
Рис.1. Результат работы приложения
На следующем шаге мы рассмотрим замену при копировании.