Программирование >>  Немодифицирующие последовательные алгоритмы 

1 ... 52 53 54 [ 55 ] 56 57 58 ... 78


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, но в этой функции диапазон



1 ... 52 53 54 [ 55 ] 56 57 58 ... 78

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика