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

На странице описан вариант использования одного из обобщенных алгоритмов STL
adjacent_find

  • adjacent_find Принадлежит к группе обобщенных алгоритмов и по умолчанию выполняет работу поиска первого вхождения одинаковых элементов, которые являются соседними.

Проще показать на цифрах.
Пусть контейнер содержит следующий набор целых чисел
10     20 30     30     40     10
В этом наборе есть 2 одинаковых значения (две 10 и две 30), но соседями среди этих значений является только 30. Вот алгоритм по умолчанию как раз и ищет первую попавшуюся такую пару. Чтобы в это врубиться демонстрирую небольшой пример

После выполнения такого несложного кода вы увидите, что на экран вывелось только одно значение. Если читать слева направо, то за этим значением сразу же идет такое же. Это и есть тот сосед, которого алгоритм ищет по умолчанию.

То, что этот пример выводит только одно значение не обозначает ограниченности алгоритма. Если умеешь вертеть итераторами, то понимаешь, что можно вытащить следующиее такое значение добавив пару строк кода.

Я чуть изменю массив, чтобы было как-то более лучше видно результат работы.

Здесь в строке it = adjacent_find(++it,v.end()); два плюса стоят перед итератором. Это обозначает, что сначала надо сместить итератор на следующее значение и только потом выполнять алгоритм. Нетрудно догадаться, что чтобы получить все соседдние пары, можно использовать цикл while

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

В общем-то говоря хотелось бы сказать, что это все, как на многих сайтах, но не всё. Обобщенный алгоритм adjacent_find умеет принимать в свои параметры указатель на функцию. Говорят, что это предикат. Может возникнуть вопрос зачем это нужно. Это нужно в том случае, если нужно немного изменить само поведение алгоритма. Например можно искать не одинаковые пары, а таких соседей, чтобы, например, правый сосед был меньше левого на 5 или чтобы левый сосед делился на правого соседа или как-то еще. В общем предикатная функция нужна для модификации поведенияя алгоритма adjacent_find, благодаря чему возможности использования алгоритма становятся шире.

Я покажу простой пример, где будет выполняться поиск таких соседей, чтоб правыфй был на 5 больше левого. Как вы поняли, я использую предикатную функцию.

Наверное далеко не каждый сходу осилит смысл return 0==j-5-i;
Давайте вспомним школу. 0==j-5-i ===> 5+i ==j (Тождество).
i в функции является левым значением, j правым
Если К первому значению прибавить 5 и оно будет равно правому значению, то функция вернет Истина.
Такая не самая обычная запись обусловлена безопасностью, потому как можно нечаянно не так написать, например, символ равно или что-то еще начудить и доказывать всем, что не работает. Как константы параметры указаны по той же причине. Лишний раз обезопасить себя от ошибок не будет лишним.

Теперь если вы внимательно изучали код, то увидели, что в момент присваивания в итератор результата работы алгоритма в алгоритме появился третий параметр, который есть имя нашей предикатной функции. Сама предикатная функция имеет имя myfunction и принимает два параметра (Это наши соседи, которые по какому-то принципу сравниваются). Имя может быть произвольным.

Обязательно почитайте общее описание обобщенных алгоритмов. Я не описал некоторые моменты, птотому как моя цель была в том, чтобы как-то разъяснить смысл работы и показать некоторые приемы использования одного из обобщенных алгоритмов, который называется adjacent_find

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

Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

3 комментария: STL Обобщенные алгоритмы. adjacent_find (алгоритм поиска)

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

Ваш e-mail не будет опубликован.

Поиск

 
     

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

Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

Демотиватор программирование на языке ада

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок