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

FreeBSD Manual Pages

  
 
  

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

NAME
       std::equal - std::equal

Synopsis
	  Defined in header <algorithm>
	  template< class InputIt1, class InputIt2 >
							       (until
	  bool equal( InputIt1 first1, InputIt1	last1,	       C++20)

	  InputIt2 first2 );
	  template< class InputIt1, class InputIt2 >

	  constexpr bool equal(	InputIt1 first1,	       (since
	  InputIt1 last1,				       C++20)

	  InputIt2 first2 );
	  template< class ExecutionPolicy,

	  class	ForwardIt1,
	  class	ForwardIt2 >				       (since
	  bool equal( ExecutionPolicy&&	policy,		   (2) C++17)
	  ForwardIt1 first1,
	  ForwardIt1 last1,

	  ForwardIt2 first2 );
	  template< class InputIt1,

	  class	InputIt2,
	  class	BinaryPredicate	>				       (until
	  bool equal( InputIt1 first1,				       C++20)
	  InputIt1 last1,
	  InputIt2 first2,

	  BinaryPredicate p );
	  template< class InputIt1,

	  class	InputIt2,
	  class	BinaryPredicate	>				       (since
	  constexpr bool equal(	InputIt1 first1,		       C++20)
	  InputIt1 last1,
	  InputIt2 first2,

	  BinaryPredicate p );
	  template< class ExecutionPolicy,

	  class	ForwardIt1,
	  class	ForwardIt2,
	  class	BinaryPredicate	>				       (since
	  bool equal( ExecutionPolicy&&	policy,		       (4)     C++17)
	  ForwardIt1 first1,
	  ForwardIt1 last1,
	  ForwardIt2 first2,
						       (1)
	  BinaryPredicate p );
	  template<	  class	     InputIt1,	    class      InputIt2	     >
       (since
									       C++14)
	  bool	   equal(      InputIt1	     first1,	  InputIt1	last1,
       (until
									       C++20)
	  InputIt2 first2, InputIt2 last2 );
	  template< class InputIt1, class InputIt2 >

	  constexpr	    bool	 equal(	       InputIt1	       first1,
       (since
	  InputIt1	   last1,					   (3)
       C++20)

	  InputIt2 first2, InputIt2 last2 );
	  template< class ExecutionPolicy,

	  class	ForwardIt1,
	  class	  ForwardIt2  >						   (6)
       (since
	  bool		 equal(		  ExecutionPolicy&&	       policy,
       C++17)
	  ForwardIt1 first1, ForwardIt1	last1,

	  ForwardIt2 first2, ForwardIt2	last2 );
	  template< class InputIt1,

	  class							     InputIt2,
       (since
	  class	    BinaryPredicate	>				   (5)
       C++14)
	  bool	    equal(	InputIt1      first1,	   InputIt1	last1,
       (until
	  InputIt2	       first2,		   InputIt2		last2,
       C++20)

	  BinaryPredicate p );
	  template< class InputIt1,

	  class	InputIt2,
	  class			       BinaryPredicate			     >
       (since
	  constexpr	   bool	       equal(	      InputIt1	       first1,
       C++20)
	  InputIt1 last1,					       (7)
	  InputIt2 first2, InputIt2 last2,

	  BinaryPredicate p );
	  template< class ExecutionPolicy,

	  class	ForwardIt1,
	  class	ForwardIt2,
	  class			       BinaryPredicate			     >
       (8)     (since
	  bool		 equal(		  ExecutionPolicy&&	       policy,
       C++17)
	  ForwardIt1 first1, ForwardIt1	last1,
	  ForwardIt2 first2, ForwardIt2	last2,

	  BinaryPredicate p );

	  1,3) Returns true if the range [first1, last1) is equal to the range
       [first2,	first2
	  + (last1 - first1)), and false otherwise.
	  5,7) Returns true if the range [first1, last1) is equal to the range
       [first2,
	  last2), and false otherwise.
	  2,4,6,8)  Same as (1,3,5,7), but executed according to policy. These
       overloads do not
	  participate in overload resolution unless
	  std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>
	  (until C++20)
	  std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>
	  (since C++20)	is true.

	  Two ranges are considered equal if they have the same	number of ele-
       ments and, for
	  every	iterator i in the range	[first1,last1),	*i equals  *(first2  +
       (i - first1)).
	  The  overloads (1,2,5,6) use operator== to determine if two elements
       are equal,
	  whereas overloads (3,4,7,8) use the given binary predicate p.

Parameters
	  first1, last1	- the first range of the elements to compare
	  first2, last2	- the second range of the elements to compare
	  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 objects
       of types
			  InputIt1 and InputIt2	can be dereferenced  and  then
       implicitly
			  converted to Type1 and Type2 respectively.

Type requirements
	  -
	  InputIt1,  InputIt2  must meet the requirements of LegacyInputItera-
       tor.
	  -
	  ForwardIt1, ForwardIt2 must  meet  the  requirements	of  LegacyFor-
       wardIterator.

Return value
	  5-8)	If  the	length of the range [first1, last1) does not equal the
       length of the
	  range	[first2, last2), returns false

	  If the elements in the two ranges are	equal, returns true.

	  Otherwise returns false.

Notes
	  std::equal should not	be used	to compare the ranges  formed  by  the
       iterators from
	  std::unordered_set, std::unordered_multiset, std::unordered_map, or
	  std::unordered_multimap  because the order in	which the elements are
       stored in those
	  containers may be different even if the  two	containers  store  the
       same elements.

	  When	comparing  entire  containers for equality, operator== for the
       corresponding
	  container are	usually	preferred.

Complexity
	  1,3) At most last1 - first1 applications of the predicate
	  5,7) At most min(last1 - first1, last2 - first2) applications	of the
       predicate.
	  However, if InputIt1 and InputIt2 meet the requirements of
	  LegacyRandomAccessIterator and last1 - first1	!= last2 - first2 then
       no applications
	  of the predicate are made (size mismatch is detected without looking
       at any
	  elements).
	  2,4,6,8) same, but the complexity is specified as O(x), rather  than
       "at most	x"

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
First version
	  template<class InputIt1, class InputIt2>
	  bool equal(InputIt1 first1, InputIt1 last1,
		     InputIt2 first2)
	  {
	      for (; first1 != last1; ++first1,	++first2) {
		  if (!(*first1	== *first2)) {
		      return false;
		  }
	      }
	      return true;
	  }

Second version
	  template<class InputIt1, class InputIt2, class BinaryPredicate>
	  bool equal(InputIt1 first1, InputIt1 last1,
		     InputIt2 first2, BinaryPredicate p)
	  {
	      for (; first1 != last1; ++first1,	++first2) {
		  if (!p(*first1, *first2)) {
		      return false;
		  }
	      }
	      return true;
	  }

Example
	  The following	code uses std::equal to	test if	a string is  a	palin-
       drome.

       // Run this code

	#include <algorithm>
	#include <iostream>
	#include <string_view>

	constexpr bool is_palindrome(const std::string_view& s)
	{
	    return std::equal(s.begin(), s.begin() + s.size()/2, s.rbegin());
	}

	void test(const	std::string_view& s)
	{
	    std::cout << "\"" << s << "\" "
		<< (is_palindrome(s) ? "is" : "is not")
		<< " a palindrome\n";
	}

	int main()
	{
	    test("radar");
	    test("hello");
	}

Output:
	"radar"	is a palindrome
	"hello"	is not a palindrome

See also
	  find
	  find_if		   finds the first element satisfying specific
       criteria
	  find_if_not		  (function template)
	  (C++11)
				  returns true if one range  is	 lexicographi-
       cally less than
	  lexicographical_compare another
				  (function template)
	  mismatch		   finds  the  first position where two	ranges
       differ
				  (function template)
	  search		  searches for a range of elements
				  (function template)
	  ranges::equal		  determines if	two sets of elements  are  the
       same
	  (C++20)		  (niebloid)
	  equal_to		  function object implementing x == y
				  (class template)
	  equal_range		   returns  range  of elements matching	a spe-
       cific key
				  (function template)

http://cppreference.com		  2022.07.31			 std::equal(3)

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

home | help