|
Программирование >> Немодифицирующие последовательные алгоритмы
задается с помощью одного итератора и количества элементов. Следующая программа использует оба алгоритма: 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 тем, что не изменяет размер контейнера. Размер массива мы все равно не можем изменить, но алгоритм не изменяет размеры и любых других контейнеров, будь то вектор.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |