◐ Shell
clean mode source ↗

std::adjacent_find — cppreference.com

Материал из cppreference.com

<tbody> </tbody>

Определено в заголовочном файле <algorithm>

template< class ForwardIt > ForwardIt adjacent_find( ForwardIt first, ForwardIt last );

(1)

template< class ForwardIt, BinaryPredicate p > ForwardIt adjacent_find( ForwardIt first, ForwardIt last, BinaryPredicate p );

(2)

Ищет в диапазоне [firstlast) два одинаковых смежных элемента. Первый вариант использует operator== для сравнения элементов, второй вариант использует заданный бинарный предикат p.

Параметры

[firstlast) два итератора задающих диапазон элементов для поиска
p бинарный предикат, который возвращает ​true если элементы следует считать равными.

Определение функции предиката должно быть эквивалентно следующему:

bool pred(const Type1 &a, const Type2 &b);

Определение не должно обязательно содержать const &, но функция не должна модифицировать принимаемые объекты.
Типы Type1 и Type2 должны быть таковы, что объект типа ForwardIt может быть разыменован и затем неявно преобразован в оба из них.

Требования к типам
-ForwardIt должен соответствовать требованиям ForwardIterator.

Возвращаемое значение

Итератор на первый из одинаковых элементов. Если такие элементы не найдены, возвращается last.

Сложность

Минимум из (result - first) и ((last - 1) - first) применений предиката, где result — возвращаемое значение.

Возможная реализация

Первый вариант
template<class ForwardIt>
ForwardIt adjacent_find(ForwardIt first, ForwardIt last)
{
    if (first == last) {
        return last;
    }
    ForwardIt next = first;
    ++next;
    for (next != last; ++next, ++first) {
        if (*first == *next) {
            return first;
        }
    }
    return last;
}
Второй вариант
template<class ForwardIt, BinaryPredicate p>
ForwardIt adjacent_find(ForwardIt first, ForwardIt last,
                        BinaryPredicate p)
{
    if (first == last) {
        return last;
    }
    ForwardIt next = first;
    ++next;
    for (next != last; ++next, ++first) {
        if (p(*first, *next)) {
            return first;
        }
    }
    return last;
}

Пример

Следующий код находит смежную пару равных элементов в массиве целых чисел.

#include <algorithm>
#include <iostream>
#include <vector>
#include <iterator>

int main()
{
    std::vector<int> v1{0, 1, 2, 3, 40, 40, 5};

    std::vector<int>::iterator result;
    result = std::adjacent_find(v1.begin(), v1.end());

    if (result == v1.end()) {
        std::cout << "нет совпадающих соседних элементов";
    } else {
        std::cout << "совпадение в позиции: " << std::distance(v1.begin(), result);
    }
}

Вывод:

См. также

удаляет последовательные повторяющиеся элементы в диапазоне
(шаблон функции) [править]