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

FreeBSD Manual Pages

  
 
  

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

NAME
       std::is_partitioned - std::is_partitioned

Synopsis
	  Defined in header <algorithm>
	  template<	 class	   InputIt,	class	  UnaryPredicate     >
       (since C++11)
	  bool	  is_partitioned(     InputIt	  first,     InputIt	 last,
       (until C++20)
	  UnaryPredicate p );
	  template< class InputIt, class UnaryPredicate	>
	  constexpr  bool  is_partitioned( InputIt first, InputIt last,	   (1)
       (since C++20)
	  UnaryPredicate p );
	  template< class ExecutionPolicy, class ForwardIt, class
	  UnaryPredicate						     >
       (2) (since C++17)
	  bool is_partitioned( ExecutionPolicy&& policy, ForwardIt
	  first, ForwardIt last, UnaryPredicate	p );

	  1) Returns true if all elements in the range [first, last) that sat-
       isfy the
	  predicate p appear before all	elements that don't. Also returns true
       if [first,
	  last)	is empty.
	  2) Same as (1), but executed according to policy. This overload does
       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.

Parameters
	  first, last -	the range of elements to check
	  policy       - the execution policy to use. See execution policy for
       details.
			unary predicate	which returns true  for	 the  elements
       expected	to be
			found in the beginning of the range.

			The  expression	 p(v)  must be convertible to bool for
       every argument v
	  p	      -	of type	(possibly const) VT, where  VT	is  the	 value
       type of InputIt,
			regardless  of	value category,	and must not modify v.
       Thus, a parameter
			type of	VT&is not allowed
			, nor is VT unless for VT a move is  equivalent	 to  a
       copy
			(since C++11).

Type requirements
	  -
	  InputIt must meet the	requirements of	LegacyInputIterator.
	  -
	  ForwardIt  must  meet	the requirements of LegacyForwardIterator. and
       its value type
	  must be convertible to UnaryPredicate's argument type
	  -
	  UnaryPredicate must meet the requirements of Predicate.

Return value
	  true if the range [first, last) is empty or  is  partitioned	by  p.
       false otherwise.

Complexity
	  At most std::distance(first, last) applications of p.

Exceptions
	  The overload with a template parameter named ExecutionPolicy reports
       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
	  template< class InputIt, class UnaryPredicate	>
	  bool is_partitioned(InputIt first, InputIt last, UnaryPredicate p)
	  {
	      for (; first != last; ++first)
		  if (!p(*first))
		      break;
	      for (; first != last; ++first)
		  if (p(*first))
		      return false;
	      return true;
	  }

Example
       // Run this code

	#include <algorithm>
	#include <array>
	#include <iostream>

	int main()
	{
	    std::array<int, 9> v = { 1,	2, 3, 4, 5, 6, 7, 8, 9 };

	    auto is_even = [](int i){ return i % 2 == 0; };
	    std::cout.setf(std::ios_base::boolalpha);
	    std::cout << std::is_partitioned(v.begin(),	v.end(), is_even) << '
       ';

	    std::partition(v.begin(), v.end(), is_even);
	    std::cout << std::is_partitioned(v.begin(),	v.end(), is_even) << '
       ';

	    std::reverse(v.begin(), v.end());
	    std::cout << std::is_partitioned(v.cbegin(), v.cend(), is_even) <<
       ' ';
	    std::cout << std::is_partitioned(v.crbegin(), v.crend(),  is_even)
       << '\n';
	}

Output:
	false true false true

See also
	  partition		 divides a range of elements into two groups
				 (function template)
	  partition_point	  locates the partition	point of a partitioned
       range
	  (C++11)		 (function template)
	  ranges::is_partitioned determines if the range is partitioned	by the
       given predicate
	  (C++20)		 (niebloid)

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

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

home | help