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

FreeBSD Manual Pages

  
 
  

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

NAME
       std::includes - std::includes

Synopsis
	  Defined in header <algorithm>
	  template< class InputIt1, class InputIt2 >

	  bool includes( InputIt1 first1, InputIt1 last1,	   (1) (const-
       expr since C++20)

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

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

			 ForwardIt2 first2, ForwardIt2 last2 );
	  template< class InputIt1, class InputIt2, class Compare
	  >

	  bool includes( InputIt1 first1, InputIt1 last1,	   (3) (const-
       expr since C++20)

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

		    class ForwardIt1, class ForwardIt2,	class
	  Compare >
	  bool includes( ExecutionPolicy&& policy,		   (4)	(since
       C++17)
			 ForwardIt1 first1, ForwardIt1 last1,

			 ForwardIt2 first2, ForwardIt2 last2,
	  Compare comp );

	  Returns true if the sorted range [first2, last2) is a	subsequence of
       the sorted
	  range	[first1, last1)	(a subsequence need not	be contiguous).

	  1)  If [first1, last1) or [first2, last2) is not sorted with respect
       to
	  operator<
	  (until C++20)
	  std::less{}
	  (since C++20), the behavior is undefined.
	  3) If	[first1, last1)	or [first2, last2) is not sorted with  respect
       to comp,	the
	  behavior is undefined.
	  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
	  first1, last1	- the sorted range of elements to examine
	  first2, last2	- the sorted range of elements to search for
	  policy	 -  the	 execution policy to use. See execution	policy
       for details.
			  comparison function object (i.e. an object that sat-
       isfies the
			  requirements of Compare) which returns true  if  the
       first argument is
			  less than (i.e. is ordered before) the second.

			  The  signature  of the comparison function should be
       equivalent to the
			  following:

			  bool cmp(const Type1&	a, const Type2&	b);
	  comp		-
			  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  ob-
       ject of type
			  InputIt can be dereferenced and then implicitly con-
       verted to both of
			  them.

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

Return value
	  true	if [first2, last2) is a	subsequence of [first1,	last1);	other-
       wise false.

	  An empty sequence is a subsequence of	any sequence, so true  is  re-
       turned if
	  [first2, last2) is empty.

Complexity
	  Given	\(\scriptsize N_1\)N
	  1 as std::distance(first1, last1) and	\(\scriptsize N_2\)N
	  2 as std::distance(first2, last2):

	  1,2) At most \(\scriptsize 2 \cdot (N_1+N_2)-1\)2(N
	  1+N
	  2)-1 comparisons using
	  operator<
	  (until C++20)
	  std::less{}
	  (since C++20).
	  3,4) At most \(\scriptsize 2 \cdot (N_1+N_2)-1\)2(N
	  1+N
	  2)-1 applications of the comparison function comp.

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
				  include (1)
	  template<class InputIt1, class InputIt2>
	  bool includes(InputIt1 first1, InputIt1 last1,
			InputIt2 first2, InputIt2 last2)
	  {
	      for (; first2 != last2; ++first1)
	      {
		  if (first1 ==	last1 || *first2 < *first1)
		      return false;
		  if (!(*first1	< *first2))
		      ++first2;
	      }
	      return true;
	  }
				  include (3)
	  template<class InputIt1, class InputIt2, class Compare>
	  bool includes(InputIt1 first1, InputIt1 last1,
			InputIt2 first2, InputIt2 last2, Compare comp)
	  {
	      for (; first2 != last2; ++first1)
	      {
		  if (first1 ==	last1 || comp(*first2, *first1))
		      return false;
		  if (!comp(*first1, *first2))
		      ++first2;
	      }
	      return true;
	  }

Example
       // Run this code

	#include <algorithm>
	#include <cctype>
	#include <iostream>

	template<class Os, class Co>
	Os& operator<<(Os& os, const Co& v)
	{
	    for	(const auto& i : v)
		os << i	<< ' ';
	    return os << '\t';
	}

	int main()
	{
	    const auto
		v1 = {'a', 'b',	'c', 'f', 'h', 'x'},
		v2 = {'a', 'b',	'c'},
		v3 = {'a', 'c'},
		v4 = {'a', 'a',	'b'},
		v5 = {'g'},
		v6 = {'a', 'c',	'g'},
		v7 = {'A', 'B',	'C'};

	    auto no_case = [](char a,  char  b)	 {  return  std::tolower(a)  <
       std::tolower(b);	};

	    std::cout
	    << v1 << "\nincludes:\n" <<	std::boolalpha
	    <<	v2  << ": " << std::includes(v1.begin(), v1.end(), v2.begin(),
       v2.end()) << '\n'
	    << v3 << ":	" << std::includes(v1.begin(),	v1.end(),  v3.begin(),
       v3.end()) << '\n'
	    <<	v4  << ": " << std::includes(v1.begin(), v1.end(), v4.begin(),
       v4.end()) << '\n'
	    << v5 << ":	" << std::includes(v1.begin(),	v1.end(),  v5.begin(),
       v5.end()) << '\n'
	    <<	v6  << ": " << std::includes(v1.begin(), v1.end(), v6.begin(),
       v6.end()) << '\n'
	    << v7 << ":	" << std::includes(v1.begin(),	v1.end(),  v7.begin(),
       v7.end(), no_case)
		  << " (case-insensitive)\n";
	}

Output:
	a b c f	h x
	includes:
	a b c	: true
	a c	: true
	a a b	: false
	g	: false
	a c g	: false
	A B C	: true (case-insensitive)

	  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
	  LWG 1205 C++98      the return value was unclear if		   re-
       turns true in this
			      [first2, last2) is empty			  case

See also
	  set_difference   computes the	difference between two sets
			   (function template)
	  search	   searches for	a range	of elements
			   (function template)
	  ranges::includes  returns  true  if one sequence is a	subsequence of
       another
	  (C++20)	   (niebloid)

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

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

home | help