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

FreeBSD Manual Pages

  
 
  

home | help
std::ranges...ition_point(3)  C++ Standard Libary std::ranges...ition_point(3)

NAME
       std::ranges::partition_point - std::ranges::partition_point

Synopsis
	  Defined in header <algorithm>
	  Call signature
	  template< std::forward_iterator I, std::sentinel_for<I> S,

	  class	Proj = std::identity,
	  std::indirect_unary_predicate<std::projected<I,  Proj>>  Pred	>  (1)
       (since C++20)
	  constexpr I

	  partition_point( I first, S last, Pred pred, Proj proj = {} );
	  template< ranges::forward_range R,

	  class	Proj = std::identity,
	  std::indirect_unary_predicate<				   (2)
       (since C++20)
	  std::projected<ranges::iterator_t<R>,	Proj>> Pred >
	  constexpr ranges::borrowed_iterator_t<R>

	  partition_point( R&& r, Pred pred, Proj proj = {} );

	  Examines  the	partitioned (as	if by ranges::partition) range [first,
       last) or	r and
	  locates the end of the first partition, that is, the projected  ele-
       ment that does not
	  satisfy pred or last if all projected	elements satisfy pred.

	  The  function-like  entities	described  on this page	are niebloids,
       that is:

	    * Explicit template	argument lists may not be specified when call-
       ing any of them.
	    * None of them is visible to argument-dependent lookup.
	    * When one of them is found	by normal unqualified lookup  for  the
       name to the left
	      of  the  function-call  operator,	it inhibits argument-dependent
       lookup.

	  In practice, they may	be implemented as function  objects,  or  with
       special compiler
	  extensions.

Parameters
	  first, last -	iterator-sentinel defining the partially-ordered range
       to examine
	  r	      -	the partially-ordered range to examine
	  pred	      -	predicate to apply to the projected elements
	  proj	      -	projection to apply to the elements

Return value
	  The  iterator	 past  the  end	 of the	first partition	within [first,
       last) or	the
	  iterator equal to last if all	projected elements satisfy pred.

Complexity
	  Given	N = ranges::distance(first, last), performs O(log N)  applica-
       tions of	the
	  predicate pred and projection	proj.

	  However,  if	sentinels  don't model std::sized_sentinel_for<I>, the
       number of iterator
	  increments is	O(N).

Notes
	  This algorithm is a more general form	of ranges::lower_bound,	 which
       can be expressed
	  in  terms  of	 ranges::partition_point  with	the predicate [&](auto
       const& e) { return
	  std::invoke(pred, e, value); });.

Example
       // Run this code

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

	auto print_seq = [](auto rem, auto first, auto last) {
	    for	(std::cout << rem; first != last; std::cout << *first++	 <<  '
       ') {}
	    std::cout << '\n';
	};

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

	    auto is_even = [](int i){ return i % 2 == 0; };

	    std::ranges::partition(v, is_even);
	    print_seq("After partitioning, v: ", v.cbegin(), v.cend());

	    const auto pp = std::ranges::partition_point(v, is_even);
	    const auto i = std::ranges::distance(v.cbegin(), pp);
	    std::cout  << "Partition point is at " << i	<< "; v[" << i << "] =
       " << *pp	<< '\n';

	    print_seq("First partition (all  even  elements):  ",  v.cbegin(),
       pp);
	    print_seq("Second partition	(all odd elements): ", pp, v.cend());
	}

Possible output:
	After partitioning, v: 2 4 6 8 5 3 7 1 9
	Partition point	is at 4; v[4] =	5
	First partition	(all even elements): 2 4 6 8
	Second partition (all odd elements): 5 3 7 1 9

See also
	  ranges::is_sorted    checks whether a	range is sorted	into ascending
       order
	  (C++20)	      (niebloid)
	  ranges::lower_bound returns an iterator to  the  first  element  not
       less than the given
	  (C++20)	      value
			      (niebloid)
	  partition_point      locates	the  partition	point of a partitioned
       range
	  (C++11)	      (function	template)

http://cppreference.com		  2022.07.31	  std::ranges...ition_point(3)

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

home | help