|
Программирование >> Немодифицирующие последовательные алгоритмы
7.2.5. Заменить void replace (Forwardlterator first, Forwardlterator last, const T& old value, const T& new value); void replace if (Forwardlterator first, Forwardlterator last. Predicate pred, const T& new value); Outputlterator replace copy (Inputlterator first, Inputlterator last, Outputlterator result, const T& old value, const T& new value); Outputlterator repJace copy if (Inputlterator first, Inputlterator last, Outputlterator result. Predicate pred, const T& new value); В разделе 1.10 нами уже обсуждался алгоритм replace. Напомним, что мы можем в имеющемся целочисленном массиве а, определенном как int а[5] = {8, 8, 8, О, 8}; заменить все элементы со значением 8 на 1, выполнив гер1асе(а, а+5, 8, 1); что даст в результате массив, содержащий 1, 1, 1, О, 1. В STL также определена функция replace if, которая имеет отличающийся третий аргумент - унарный предикат, задающий некоторое условие. Все элементы, удовлетворяющие этому условию, будут заменены на значение, заданное четвертым аргументом функции. Алгоритм replace if демонстрирует следующая программа: repl if.срр: Заменить все ненулевые элементы массива на 1. iinclude <iostream> iinclude <algorithm> using namespace std; bool nonzero(int x) {return x != 0;} int mainO { int a[5] = {10, 20, 30, 0, 40}; replace if(a, a+5, nonzero, 1); cout After replace if:\n ; copy(a, a+5, ostream iterator<int>(cout, )); cout endl; return 0; Все ненулевые элементы в массиве {10, 20, 30, О, 40} заменяются на 1, поэтому программа выводит: After replace if: 1110 1 Два алгоритма replace сору и replace copy if очень похожи на replace и replaceif. Вместо того чтобы производить замену в исходном контейнере, они сначала копируют этот контейнер в другой, а затем заменяют элементы в новом контейнере, не модифицируя источник. Третий аргумент этих функций задает начало контейнера, в котором будет храниться результат копирования и замены, что мы покажем в следующей программе: replcopy.срр: гер1асе сору и replace copy if. iinclude <iostream> iinclude <vector> iinclude <algorithm> using namespace std; bool not ten(int x) {return x != 10;} int mainO { int a[5] = {10, 20, 20, 10, 40}; cout Array a:\n ; copy(a, a+5, ostream iterator<int>(cout, )); vector<int> v; vector<int>::iterator i; replace copy(a, a+5, inserter(v, v.beginO), 20, 49); cout \n\nAfter the execution of\n replace copy (a, a+5, inserter(v, v.beginO), 20, 49); \nvector V has the following contents:\n ; copy (v.begin 0 , v.endO, ostream iterator<int>(cout, )); replace copy if (a, a+5, v.beginO, not ten, 99); cout \n\nAfter the execution of\n replace if copy(a, a+5, v.beginO, not ten, 99); \nvector V has the following contents:\n ; copy(v.begin() , v.endO, ostream iterator<int>(cout, )); cout endl; return 0; В приведенной программе вектор v сначала пуст, поэтому мы используем режим вставки при первом вызове алгоритма гер1асе сору. Он копирует массив а в вектор v, заменяя значения 20 на 49. После этого алгоритм replace copi/ if делает такую же операцию, но заменяя все значения, отличные от 10, на 99 в режиме замещения. Все это ясно видно из вывода, который создает эта программа: Array а: 10 20 20 10 40 After the execution of replace copy (a, a+5, inserter (v, v.beginO), 20, 49); vector V has the following contents: 10 49 49 10 40 After the execution of replace if copy (a, a+5, v.beginO, not ten, 99); vector V has the following contents: 10 99 99 10 99 7.2.6. Удалить Forwardlterator remove (Forwardlterator first, Forwardlterator last, const T& value); Forwardlterator remove if (Forwardlterator first, Forwardlterator last. Predicate pred); Outputlterator remove copy (Inputlterator first, Inputlterator last, Outputlterator result, const T& value); Outputlterator re/nove copy if (Inputlterator first, Inputlterator last, Outputlterator result, Predicate pred); Алгоритмы remove и remove if мы обсуждали в разделе 1.13. Как видно из названий remove сору и remove сору if лвух других вариантов, они работают с копией, а не с исходным контейнером. Поскольку принцип действия здесь тот же, что и у только что рассмотренных нами функций replace сору и replace copy if, мы не будем подробно обсуждать эти варианты алгоритма remove. 7.2.7. Заполнить void fill (Forwardlterator first, Forwardlterator last, const T& value); void fill n (Outputlterator first. Size n, const T& value); Алгоритм fill (заполнить) присваивает заданное значение всем элементам диапазона. Как обычно, диапазон задается с помощью двух итераторов. Алгоритм fill n работает так же, как и fill, но в этой функции диапазон
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |