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

NAME
     std::generate_n - std::generate_n

Synopsis
	Defined in header <algorithm>
	template< class OutputIt, class Size, class Generator >
	OutputIt  generate_n( OutputIt first, Size count,	  (1) (constexpr
     since C++20)
	Generator g );
	template< class ExecutionPolicy,

		  class ForwardIt, class Size, class Generator >
	ForwardIt  generate_n(	ExecutionPolicy&&  policy,	     (2)  (since
     C++17)

			      ForwardIt first, Size count,
	Generator g );

	1)  Assigns  values,  generated by given function object g, to the first
     count elements
	in the range beginning at first, if count > 0. Does nothing otherwise.
	2) Same as (1), but executed according to policy.
	This overload participates 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)

	If Size is not convertible to an integral  type,  the  program	is  ill-
     formed.

Parameters
	first	- the beginning of the range of elements to generate
	count	- number of the elements to generate
	policy	- the execution policy to use. See execution policy for details.
		  generator function object that will be called.

		  The signature of the function should be equivalent to the fol-
     lowing:
	g	-
		  Ret fun();

		  The  type Ret must be such that an object of type OutputIt can
     be
		  dereferenced and assigned a value of type Ret.

Type requirements
	-
	OutputIt must meet the requirements of LegacyOutputIterator.
	-
	ForwardIt must meet the requirements of LegacyForwardIterator.

Return value
	Iterator one past the last element assigned if count > 0,  first  other-
     wise.

Complexity
	Exactly std::max(0, count) invocations of g() and assignments.

Exceptions
	The overload with a template parameter named ExecutionPolicy reports er-
     rors 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::terminate
     is called.
	    For  any  other  ExecutionPolicy, the behavior is implementation-de-
     fined.
	  * If the algorithm fails to allocate memory, std::bad_alloc is thrown.

Possible implementation
	template<class OutputIt, class Size, class Generator>
	constexpr // since C++20
	OutputIt generate_n(OutputIt first, Size count, Generator g)
	{
	    for (Size i = 0; i < count; ++i, ++first)
		*first = g();

	    return first;
	}

Example
     // Run this code

      #include <algorithm>
      #include <functional>
      #include <iostream>
      #include <iterator>
      #include <random>

      int main()
      {
	  std::mt19937 rng; // default constructed, seeded with fixed seed
	  std::generate_n(std::ostream_iterator<std::mt19937::re-
     sult_type>(std::cout, " "),
			  5, std::ref(rng));
	  std::cout << '\n';
      }

Output:
      3499211612 581869302 3890346734 3586334585 545404204

	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
			   the complexity requirement was aexactly no invocation
     or
	LWG 426 C++98	   count invocations			   assignment
			   or assignmentsa, which is broken if	   if  count  is
     non-positive
			   count is negative
			   the location of the first element
	LWG 865 C++98	   following				   returned
			   the generation range was not returned

See also
	fill_n		   copy-assigns the given value to N elements in a range
			   (function template)
			   assigns  the  results of successive function calls to
     every element
	generate	   in a range
			   (function template)
	ranges::generate_n saves the result of N applications of a function
	(C++20) 	   (niebloid)

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

home | help