Пространства имён
Варианты
Действия

std::adjacent_find

Материал из cppreference.com
 
 
Алгоритмы
Функции
Немодифицирующие линейные операции
Модифицирующие линейные операции
Разделение
Сортировка (на отсортированных промежутках)
Бинарный поиск (на отсортированных промежутках)
Множества (на отсортированных промежутках)
Куча
Минимум/максимум
Числовые операции
Библиотека C
 
Заголовочный файл <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)

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

Содержание

[править] Параметры

first, last - диапазон элементов для поиска
p - binary predicate which returns ​true if the elements should be treated as equal.

The signature of the predicate function should be equivalent to the following:

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

The signature does not need to have const &, but the function must not modify the objects passed to it.
The types  Type1 and  Type2 must be such that an object of type ForwardIt can be dereferenced and then implicitly converted to both of them.

Type requirements
-
ForwardIt must meet the requirements of ForwardIterator.

[править] Возвращаемое значение

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

[править] Сложность

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

[править] Возможная реализация

First version
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;
}
Second version
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>
 
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);
    }
}

Вывод:

совпадение в позиции: 4

[править] См. также

removes consecutive duplicate elements in a range
(шаблон функции) [edit]