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

1 ... 49 50 51 [ 52 ] 53 54 55 ... 78


рЬ = difpos.second;

cout Difference of at least 25 found between\n

<< *pa << and << *pb

<< at position << pa - a endl; return 0;

В обоих случаях отличия находятся, как видно из вывода этой программы:

0 12 3 4

50 80 30 90

50 80 10 40 20 Different elements 30 and 10 found at position 2 Difference of at least 25 found between 90 and 40 at position 3

Обратите внимание, что вторая последовательность должна быть не короче первой. Если бы отличий найти не удалось (например, при замене в тексте программы 25 на 250), возвращаемая пара итераторов соответствовала бы позиции 4 во входных массивах.

7.1.4. Сравнение на равенство

bool egual

(Inputlteratorl firstl, Inputlteratorl lastl, InputIterator2 first2); bool equal

(Inputlteratorl firstl, Inputlteratorl lastl, InputIterator2 first2, BinaryPredicate binary pred);

Алгоритмов equal также два. Первый определяет равенство двух последовательностей (в указанных диапазонах); второй работает аналогично первому, но использует передаваемый дополнительным параметром бинарный предикат вместо оператора сравнения на равенство ==. Нижеприведенная программа демонстрирует обе версии:

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

bool approx(int a, int b){return abs(a - b) <= 1;} int mainO

{ int a[4] = {50, 80, 30, 90},

b[5] = {50, 80, 30, 90, 20}, c[4] = {50, 79, 30, 90};



cout equal(а, a+4, b) << endl; 111

cout equal(a, a+4, c) << endl; 0

cout << equal(a, a+4, c, approx) << endl; 1 return 0;

Функция возвращает булевское значение true (=1) или false (= 0), как показано в комментариях. Поскольку четыре элемента а совпадают с первыми четырьмя элементами Ъ, первый вызов equal возвращает true. Второй вызов возвращает false, потому что а[1] = 80, в то время как с[1] = 79. В третьем вызове разница 80 - 79 является достаточно малой (в соответствии с определением функции approx), чтобы функция ема/вернула true. Обратите внимание, что функция equal не возвращает информацию о позиции, в которой последовательности не совпадают. Если нужна такая информация, следует пользоваться алгоритмом mismatch.

7.1.5. Поиск подпоследовательности

Forwardlteratorl search

(Forwardlteratorl firstl, Forwardlteratorl lastl,

ForwardIterator2 first2, ForwardIterator2 last2); Forwardlteratorl search

(Forwardlteratorl firstl, Forwardlteratorl lastl,

ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate predicate) ;

Первый вариант алгоритма search является обобщением известной функции поиска из библиотеки С, которая используется в следующем фрагменте:

iinclude <string.h>

char *р = strstr( ABCDEF , CD ); /* *P == С */

Библиотечная функция strstr возвращает NULL, если второй аргумент не является подстрокой первого.

Первый вариант searc/j используется для поиска (меньшей) подпоследовательности в (большей) последовательности, использует два первых параметра для задания большей последовательности (в которой ищут) и два следующих для меньшей (которую ищут). Второй вариант использует передаваемый пятым параметром бинарный предикат вместо оператора сравнения на равенство ==. Следующая программа показывает работу обоих алгоритмов search:

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



При первом вызове элементы b[0] и b[i] были найдены как а[2] и а[3], поэтому функция search возвратила адрес элемента а[2], который был сохранен в указателе р1. Поскольку три элемента массива с отсутствуют в а, указатель р2 получает значение, ссылающееся на элемент, непосредственно следующий за последним элементом массива а. И наконец, присваивается адрес а[2], потому что элементы 50, 30 и 60 массива а соответствуют элементам 51, 31 и 61 массива с согласно предикату difi.

7.2. Модифицирующие последовательные алгоритмы

Алгоритмы в этом разделе изменяют последовательность, с которой работают. 7.2.1. Преобразовать

Outputlterator transform

(Inputlterator first, Inputlterator last, Outputlterator result, UnaryOperation unary op); Outputlterator traлsform

(Inputlteratorl firstl, Inputlteratorl lastl, InputIterator2 first2, Outputlterator result, BinaryOperation binary op);

Мы обсуждали алгоритмы transform в разделе 6.5, когда рассматривали функциональные объекты. Вспомним, что существуют два алгоритма transform: первый преобразует одну последовательность, а второй - две. Следующая программа использует оба алгоритма другим способом, нежели в примерах раздела 6.5: мы теперь применяем обычные функции вместо функциональных объектов. Так как вектор result изначально пуст, первый вызов transform работает в режиме вставки (с помощью адаптера inserter), как рассмотрено в разделе 1.6. После этого вектор result содержит пять элементов, поэтому во втором вызове transform мы можем использовать режим замещения и заменить эти элементы.

bool difKint X, int у) {return х + 1 == у;} int main О

{ int a{6] = {10, 20, 50, 30, 60, 40}, b{2] = {50, 30},

c[3] = {51, 31, 61}, *pl, *p2, *p3; pi = search(a, a+6, b, b+2); cout << pi - a << ; p2 = search(a, a+6, c, c+3); cout p2 - a << ; p3 = search(a, a+6, c, c+3, difl); cout p3 - a

endl; Вывод: 2 6 2 return 0;



1 ... 49 50 51 [ 52 ] 53 54 55 ... 78

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