std::adjacent_find
| Определено в заголовочном файле <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 | — | бинарный предикат, который возвращает true если элементы следует считать равными. Определение функции предиката должно быть эквивалентно следующему:
Определение не должно обязательно содержать |
| Требования к типам | ||
-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);
}
}
Вывод:
совпадение в позиции: 4
См. также
| удаляет последовательные повторяющиеся элементы в диапазоне (шаблон функции) |