C++. Обобщенные алгоритмы. adjacent_find (алгоритм поиска)

  • adjacent_find принадлежит к группе обобщенных алгоритмов и по умолчанию выполняет поиск первого вхождения одинаковых элементов, являющихся соседними.
10 20 30 30 30 40 10
В показанной последовательности есть несколько пар одинаковых элементов, но первыми соседничают выделенные красным 30 и 30. Алгоритм находит вхождение первой пары и возвращает итератор (аналог указателя) на первый элемент найденной пары, либо, если не нашлось ничего, итератор на конец последовательности. С помощью найденного итератора можно вытащить найденое значение, либо использовать итератор для других целей.
Поскольку найденных значений может не быть, надо учитывать это, иначе можно получить неправильный результат. Когда вхождений не нашлось, алгоритм устанавливает итератор на конце обойдённой последовательности, на это и проверяем:
Если работать с итераторами как с указателями, то можно смещаться относительно найденной позиции. cout << *(it + 1); выведет второе значение пары (оно всегда равно первому).
Чтобы вывести все пары соседних элементов, можно сделать цикл, в котором с нахождением очередной пары смещать итератор на следующий элемент.
Иногда может быть нужно немного подстроить алгоритм под себя. Например, можно искать соседей не равных друг другу, а так, чтобы правый сосед был меньше левого на 5, тогда можно написать предикатную функцию (после введения лямбда-выражений пишут не функции и функторы, а лямбда выражения). Но здесь я покажу на функции:
Листинги #a1 и #a2 выполняют одно и то же, просто #a1 короче, поэтому используется почти всегда именно подобное написание.
В #3.1 мы получили первое вхождение таких соседей, у которых правый больше левого на 5. Такая пара — это 40 45. Если бы нужно было в любое время задавать своё число вместо 5, следовало бы использовать лямбда-выражения или функторы:
Про лямбда-выражения можно узнать в этой теме: С++. Лямбда-функции. Знакомство с синтаксисом
Когда я решил написать об этом алгоритме, меня привекло странное для меня название, но в итоге оказалось, что он не очень интересный, хотя, если кто-то нашёл, что искал, то это здорово.

3 комментария на «“C++. Обобщенные алгоритмы. adjacent_find (алгоритм поиска)”»

  1. мир:

    на втом примере эту функцию bool myfunction (int i ,int j) внтри main я не вижу . как она вызивается?

  2. Юрий:

    А что делать, если вызов алгоритма adjacent_find вызывает ошибку «Call to undefined function»

    при условии , что файл <algorithm> подключён?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Поиск

 
     

Случайная книга в электронном формате

https://www.litres.ru/denis-kolisnichenko/php-5-6-i-mysql-6-razrabotka-web-prilozheniy/?lfrom=15589587
Яндекс.Метрика