home | help
std::adjacent_find(3)	       C++ Standard Libary	   std::adjacent_find(3)

NAME
     std::adjacent_find - std::adjacent_find

Synopsis
	Defined in header <algorithm>
	template< class ForwardIt >
	ForwardIt  adjacent_find( ForwardIt first, ForwardIt last (1) (constexpr
     since C++20)
	);
	template< class ExecutionPolicy, class ForwardIt >

	ForwardIt  adjacent_find(  ExecutionPolicy&&  policy,	     (2)  (since
     C++17)

				 ForwardIt first, ForwardIt last
	);
	template< class ForwardIt, class BinaryPred >

	ForwardIt  adjacent_find( ForwardIt first, ForwardIt	  (3) (constexpr
     since C++20)
	last,

				 BinaryPred p );
	template< class ExecutionPolicy, class ForwardIt, class
	BinaryPred >

	ForwardIt  adjacent_find(  ExecutionPolicy&&  policy,	     (4)  (since
     C++17)
				 ForwardIt first, ForwardIt
	last,

				 BinaryPred p );

	Searches the range [first, last) for two consecutive equal elements.

	1) Elements are compared using operator==.
	3) Elements are compared using the given binary predicate p.
	2,4) Same as (1,3), but executed according to policy.
	These overloads participate in overload resolution only if

	std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>    is    true.
     (until
										  C++20)
	std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>      is
     true. (since
										  C++20)

Parameters
	first, last - the range of elements to examine
	policy	     - the execution policy to use. See execution policy for de-
     tails.
		      binary predicate which returns true if the elements should
     be treated
		      as equal.

		      The signature of the predicate function should be  equiva-
     lent to the
		      following:

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

	p	     -	While  the  signature does not need to have const &, the
     function must
		      not modify the objects passed to it and must  be	able  to
     accept all
		      values of type (possibly const) Type1 and Type2 regardless
     of value
		      category (thus, Type1 & is not allowed
		      ,  nor is Type1 unless for Type1 a move is equivalent to a
     copy
		      (since C++11)).
		      The types Type1 and Type2 must be such that an  object  of
     type
		      ForwardIt  can  be  dereferenced	and then implicitly con-
     verted to both of
		      them.

Type requirements
	-
	ForwardIt must meet the requirements of LegacyForwardIterator.
	-
	BinaryPred must meet the requirements of BinaryPredicate.

Return value
	An iterator to the first of the first pair of identical  elements,  that
     is, the first
	iterator it such that *it == *(it + 1) for (1,2) or p(*it, *(it + 1)) !=
     false for
	(3,4).

	If no such elements are found, last is returned.

Complexity
	Given result as the return value of adjacent_find, \(\scriptsize M\)M as
	std::distance(first,   result)	 and  \(\scriptsize  N\)N  as  std::dis-
     tance(first, last):

	1) Exactly \(\scriptsize \min(M+1,N-1)\)min(M+1,N-1)  comparisons  using
     operator==.
	2) \(\scriptsize O(N)\)O(N) comparisons using operator==.
	3) Exactly \(\scriptsize \min(M+1,N-1)\)min(M+1,N-1) applications of the
     predicate
	p.
	4) \(\scriptsize O(N)\)O(N) applications of the predicate p.

Exceptions
	The overloads with a template parameter named ExecutionPolicy report er-
     rors as
	follows:

	  *  If  execution of a function invoked as part of the algorithm throws
     an exception
	    and ExecutionPolicy is one of the standard policies,  std::terminate
     is called.
	    For  any  other  ExecutionPolicy, the behavior is implementation-de-
     fined.
	  * If the algorithm fails to allocate memory, std::bad_alloc is thrown.

Possible implementation
				  adjacent_find (1)
	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;
	}
				  adjacent_find (3)
	template<class ForwardIt, class BinaryPred>
	ForwardIt adjacent_find(ForwardIt first, ForwardIt last, BinaryPred p)
	{
	    if (first == last)
		return last;

	    ForwardIt next = first;
	    ++next;

	    for (; next != last; ++next, ++first)
		if (p(*first, *next))
		    return first;

	    return last;
	}

Example
     // Run this code

      #include <algorithm>
      #include <functional>
      #include <iostream>
      #include <vector>

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

	  auto i1 = std::adjacent_find(v1.begin(), v1.end());

	  if (i1 == v1.end())
	      std::cout << "No matching adjacent elements\n";
	  else
	      std::cout << "The first adjacent pair of equal elements is at "
			<< std::distance(v1.begin(), i1) << ", *i1 = "
			<< *i1 << '\n';

	  auto	    i2	    =	   std::adjacent_find(v1.begin(),      v1.end(),
     std::greater<int>());
	  if (i2 == v1.end())
	      std::cout << "The entire vector is sorted in ascending order\n";
	  else
	      std::cout  <<  "The last element in the non-decreasing subsequence
     is at "
			<< std::distance(v1.begin(), i2) << ", *i2 = " << *i2 <<
     '\n';
      }

Output:
      The first adjacent pair of equal elements is at 4, *i1 = 40
      The last element in the non-decreasing subsequence is at 7, *i2 = 41

	Defect reports

	The following behavior-changing defect	reports  were  applied	retroac-
     tively to
	previously published C++ standards.

	  DR	 Applied  to	      Behavior as published		 Correct
     behavior
			   the	predicate  was	applied  std::find	 applied
     std::min(
	LWG  240  C++98       (first,  last, value) - first times      (result -
     first) + 1,
			   for (1,3),  where  value  was  never 	(last  -
     first) - 1) times
			   defined

See also
	unique		      removes consecutive duplicate elements in a range
			      (function template)
	ranges::adjacent_find  finds the first two adjacent items that are equal
     (or satisfy
	(C++20) 	      a given predicate)
			      (niebloid)

http://cppreference.com 	   2024.06.10		   std::adjacent_find(3)

home | help