|
Программирование >> Немодифицирующие последовательные алгоритмы
рЬ = 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;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |