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

FreeBSD Manual Pages

  
 
  

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

NAME
       std::search_n - std::search_n

Synopsis
	  Defined in header <algorithm>
	  template< class ForwardIt, class
	  Size,	class T	>
						    (constexpr
	  ForwardIt search_n( ForwardIt		    since C++20)
	  first, ForwardIt last,		    (until C++26)

			      Size count,
	  const	T& value );
	  template< class ForwardIt, class

Size,
		    class T = typename
	  std::iterator_traits
						    (since C++26)
	  <ForwardIt>::value_type >
	  constexpr ForwardIt search_n(
	  ForwardIt first, ForwardIt last,

	  Size count, const T& value );
	  template< class ExecutionPolicy,

		    class ForwardIt, class
	  Size,	class T	>					  (since
	  ForwardIt search_n(					  C++17)
	  ExecutionPolicy&& policy,				  (until
			      ForwardIt				  C++26)
	  first, ForwardIt last,

			      Size count,
	  const	T& value );
	  template< class ExecutionPolicy,

		    class ForwardIt, class

Size,
		    class T = typename
	  std::iterator_traits
								  (since
	  <ForwardIt>::value_type >				  C++26)
	  ForwardIt search_n(
	  ExecutionPolicy&& policy,
			      ForwardIt
	  first, ForwardIt last,

			      Size count,
	  const	T& value );
	  template< class ForwardIt, class  (1)
	  Size,	class T, class BinaryPred >
									  (con-
       stexpr
	  ForwardIt			search_n(		     ForwardIt
       since C++20)
	  first, ForwardIt last,					  (un-
       til
									  C++26)
			      Size count,
	  const	T& value, BinaryPred p );
	  template< class ForwardIt, class

Size,
						(2)
		    class T = typename
	  std::iterator_traits
									  (since
	  <ForwardIt>::value_type,
       C++26)
		    class BinaryPred >
	  constexpr ForwardIt search_n(
	  ForwardIt first, ForwardIt last,

			      Size count,
	  const	T& value, BinaryPred p );
	  template< class ExecutionPolicy,
	  class	ForwardIt, class Size,
						    (3)
		    class T, class
	  BinaryPred							     >
       (since
	  ForwardIt						     search_n(
       C++17)
	  ExecutionPolicy&&					       policy,
       (until
			      ForwardIt
       C++26)
	  first, ForwardIt last,

			      Size count,
	  const	T& value, BinaryPred p );
	  template< class ExecutionPolicy,
	  class	ForwardIt, class Size,				  (4)

		    class T = typename
	  std::iterator_traits

	  <ForwardIt>::value_type,
       (since
		    class		      BinaryPred		     >
       C++26)
	  ForwardIt search_n(
	  ExecutionPolicy&& policy,
			      ForwardIt
	  first, ForwardIt last,

			      Size count,
	  const	T& value, BinaryPred p );

	  Searches the range [first, last) for the  first  sequence  of	 count
       identical elements,
	  each equal to	the given value.

	  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
	  count	      -	the length of the sequence to search for
	  value	      -	the value of the elements to search for
	  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  type  Type1  must	be such	that an	object of type
       ForwardIt can be
			dereferenced and then implicitly converted  to	Type1.
       The type	Type2
			must  be  such that an object of type T	can be implic-
       itly converted to
			Type2.

Type requirements
	  -
	  ForwardIt must meet the requirements of LegacyForwardIterator.
	  -
	  BinaryPred must meet the requirements	of BinaryPredicate.
	  -
	  Size must be convertible to an integral type.

Return value
	  If count is positive,	returns	an iterator to the  beginning  of  the
       first sequence
	  found	 in  the range [first, last). Each iterator it in the sequence
       should satisfy
	  the following	condition:

	  1,2) *it == value is true.
	  3,4) p(*it, value) !=	false is true.

	  If no	such sequence is found,	last is	returned.

	  If count is zero or negative,	first is returned.

Complexity
	  Given	\(\scriptsize N\)N as std::distance(first, last):

	  1,2) At most \(\scriptsize N\)N comparisons using operator==.
	  3,4) At most \(\scriptsize N\)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
					   search_n (1)
	  template<class ForwardIt, class Size,
		   class     T	   =	 typename    std::iterator_traits<For-
       wardIt>::value_type>
	  ForwardIt search_n(ForwardIt	first,	ForwardIt  last,  Size	count,
       const T&	value)
	  {
	      if (count	<= 0)
		  return first;

	      for (; first != last; ++first)
	      {
		  if (!(*first == value))
		      continue;

		  ForwardIt candidate =	first;

		  for (Size cur_count =	1; true; ++cur_count)
		  {
		      if (cur_count >= count)
			  return candidate; // success

		      ++first;
		      if (first	== last)
			  return last; // exhausted the	list

		      if (!(*first == value))
			  break; // too	few in a row
		  }
	      }
	      return last;
	  }
					   search_n (3)
	  template<class ForwardIt, class Size,
		   class     T	   =	 typename    std::iterator_traits<For-
       wardIt>::value_type,
		   class BinaryPred>
	  ForwardIt search_n(ForwardIt	first,	ForwardIt  last,  Size	count,
       const T&	value,
			     BinaryPred	p)
	  {
	      if (count	<= 0)
		  return first;

	      for (; first != last; ++first)
	      {
		  if (!p(*first, value))
		      continue;

		  ForwardIt candidate =	first;

		  for (Size cur_count =	1; true; ++cur_count)
		  {
		      if (cur_count >= count)
			  return candidate; // success

		      ++first;
		      if (first	== last)
			  return last; // exhausted the	list

		      if (!p(*first, value))
			  break; // too	few in a row
		  }
	      }
	      return last;
	  }

Notes
		    Feature-test       macro		     Value	   Std
       Feature
	  __cpp_lib_algorithm_default_value_type 202403	(C++26)	 List-initial-
       ization for
								algorithms
       (1-4)

Example
       // Run this code

	#include <algorithm>
	#include <cassert>
	#include <complex>
	#include <iostream>
	#include <iterator>
	#include <vector>

	template<class Container, class	Size, class T>
	constexpr  bool	 consecutive_values(const  Container&  c,  Size	count,
       const T&	v)
	{
	    return  std::search_n(std::begin(c),  std::end(c),	count,	v)  !=
       std::end(c);
	}

	int main()
	{
	    constexpr char sequence[] =	".0_0.000.0_0.";

	    static_assert(consecutive_values(sequence, 3, '0'));

	    for	(int n : {4, 3,	2})
		std::cout << std::boolalpha
			  << "Has " << n << " consecutive zeros: "
			  << consecutive_values(sequence, n, '0') << '\n';

	    std::vector<std::complex<double>> nums{{4, 2}, {4, 2}, {1, 3}};
	    #ifdef __cpp_lib_algorithm_default_value_type
		auto  it  =  std::search_n(nums.cbegin(),  nums.cend(),	2, {4,
       2});
	    #else
		auto  it  =   std::search_n(nums.cbegin(),   nums.cend(),   2,
       std::complex<double>{4, 2});
	    #endif
	    assert(it == nums.begin());
	}

Output:
	Has 4 consecutive zeros: false
	Has 3 consecutive zeros: true
	Has 2 consecutive zeros: true

	  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
			      T	was required to	 be  EqualityComparable,   re-
       moved the
	  LWG  283   C++98	 but					   re-
       quirement
			      the value	type of	InputIt	is not always T
			      the complexity upper limit was Ncount,   the up-
       per limit is 0
	  LWG 426  C++98      it is negative if	 count	is  negative	    if
       count is
									non-
       positive
			      if   count  >  0,	 the  complexity  upper	 limit
       changed the upper
	  LWG 714  C++98      was Ncount, but  in			 limit
       to N in this
			      the worst	case the number	of		case
			      comparisons/operations is	always N
	  LWG  2150  C++98	 the  condition	of sequence occurence was cor-
       rected
			      incorrect

See also
	  find_end	   finds the last sequence of elements	in  a  certain
       range
			   (function template)
	  find
	  find_if	    finds the first element satisfying specific	crite-
       ria
	  find_if_not	   (function template)
	  (C++11)
	  search	   searches for	a range	of elements
			   (function template)
	  ranges::search_n searches for	a number consecutive copies of an ele-
       ment in a range
	  (C++20)	   (niebloid)

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

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

home | help