Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

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) (const-
       expr 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) (const-
       expr 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
       details.
			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);

	  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 re-
       gardless	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 us-
       ing 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
       errors 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::termi-
       nate is called.
	      For  any	other ExecutionPolicy, the behavior is implementation-
       defined.
	    * 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  or-
       der\n";
	    else
		std::cout  <<  "The  last element in the non-decreasing	subse-
       quence 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		  Cor-
       rect 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)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::adjacent_find&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help