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 если элементы следует считать равными. Определение функции предиката должно быть эквивалентно следующему: bool pred(const Type1 &a, const Type2 &b); Определение не должно обязательно содержать const&, но функция не должна модифицировать принимаемые объекты. |
Требования к типам | ||
-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
[править]См. также
удаляет последовательные повторяющиеся элементы в диапазоне (шаблон функции) |