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

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


задается с помощью одного итератора и количества элементов. Следующая программа использует оба алгоритма:

fill.срр: Алгоритмы fill и fill n. iinclude <iostream> iinclude <algorithm> using namespace std;

int mainO { int a[5];

filKa, a+5, 123);

copy(a, a+5, ostream iterator<int>(cout, )); cout endl; fill n(a, 2, 456) ;

copy(a, a+5, ostream iterator<int>(cout, )); cout endl; return 0;

Сначала программа присваивает значение 123 первым пяти элементам массива а. Затем два первых элемента заменяются на 456, что и показано в выводе программы:

123 123 123 123 123 456 456 123 123 123

Для векторов, массивов и двусторонних очередей вторая версия не нужна, поскольку эти контейнеры работают с итераторами произвольного доступа, так что мы можем заменить

fill n(i, п, х);

fill(i, i+n, х);

когда имеем дело с этими контейнерами. Не так обстоит дело со списками: если I является итератором для списка, выражение i + п недопустимо.

7.2.8. Породить

void generate

(Forwardlterator first, Forwardlterator last. Generator gen); void generate n

(Outputlterator first. Size n. Generator gen);

Вместо того чтобы использовать постоянное значение для заполнения контейнера, иногда желательно вычислить свое значение для каждого элемента. Это можно сделать с помощью алгоритма generate (породить).



В качестве третьего параметра этого алгоритма выступает функция или функциональный объект. Следующая программа помещает значения 10, 12, 14, 16 и 18 в массив а:

II generate.срр: Алгоритм generate, iinclude <iostream> iinclude <algorithm> using namespace std;

struct funobj { int i;

funobj 0: i(8){}

int operator0 0{return i += 2;)

int mainO { int a[5];

generate(a, a+5, funobj());

copy(a, a+5, ostream iterator<int>(cout, )); cout endl; Вывод: 10 12 14 16 18 return 0;

Обратите внимание, что мы используем функциональный объект, который содержит кроме определения функции operator) также определение конструктора и переменную-член i целого типа. Эта переменная при инициализации объекта получает значение 8 и увеличивает свое значение на 2 каждый раз, когда происходит вызов функции operatorQ, вследствие чего эта функция последовательно возвращает значения 10, 12, 14, 16 и 18.

Мы могли бы заполнить массив а теми же значениями, используя функцию

int fun О

{ static int i=8; return i += 2;

вместо класса funobj и изменив вызов generate следующим образом:

generate(а, а+5, fun);

Однако имеется тонкое различие: если бы мы вызывали generate в программе два раза и использовали функцию fun вместо функционального объекта, то во втором вызове generate переменная i не ползит значение 8; когда же мы используем функциональный объект funobj, каждый вызов алгоритма generate будет начинаться с присваивания 8 этой переменной.

Если а определен как вектор или двусторонняя очередь, содержащая, по крайней мере, 5 элементов, мы можем использовать вызов

generate(а.begin О, а.begin()+5, fun);



Однако со списком мы не можем поступить подобным образом, поскольку оператор сложения не определен для двунаправленных итераторов. К счастью, существует функция generate n, которая работает в том числе и со списком. Следующая программа отличается от предыдущей двумя аспектами: она использует функцию fun вместо функционального объекта funobjO, а также использует алгоритм generate n, чтобы мы могли задать диапазон из пяти элементов для списка.

gen n.cpp: Алгоритм generate n. iinclude <iostream> iinclude <algorithm> iinclude <list> using namespace std;

int fun()

{ static int i=8; return i += 2;

int main()

{ list<int> a(5);

generate n(a.begin(), 5, fun);

copy(a.begin() , a.endO,

ostream iterator<int>(cout, ));

cout endl; Вывод: 10 12 14 16 18

return 0;

7.2.9. Убрать повторы

Forwardlterator unique

(Forwardlterator first, Forwardlterator last); Forwardlterator unique

(Forwardlterator first, Forwardlterator last, BinaryPredicate binary pred); Outputlterator unique copy

(Inputlterator first, Inputlterator last, Outputlterator result); Outputlterator unique copy

(Inputlterator first, Inputlterator last, Outputlterator result, BinaryPredicate binary pred);

Алгоритм unique удаляет стоящие рядом одинаковые элементы в заданном диапазоне. Этот алгоритм напоминает remove тем, что не изменяет размер контейнера. Размер массива мы все равно не можем изменить, но алгоритм не изменяет размеры и любых других контейнеров, будь то вектор.



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

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