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

NAME
     std::ranges::fill_n - std::ranges::fill_n

Synopsis
	Defined in header <algorithm>
	Call signature
	template<     class    T,    std::output_iterator<const    T&>	  O    >
     (since C++20)
	constexpr O fill_n(  O	first,	std::iter_difference_t<O>  n,  const  T&
     (until C++26)
	value );
	template< class O, class T = std::iter_value_t<O> >

	requires	   std::output_iterator<O,	     const	     T&>
     (since C++26)

	constexpr O fill_n( O first, std::iter_difference_t<O> n, const T&
	value );

	Assigns the given value to all elements in the range [first, first + n).

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

	  *  Explicit  template  argument lists cannot be specified when calling
     any of them.
	  * None of them are visible to argument-dependent lookup.
	  * When any of them are found by normal unqualified lookup as the  name
     to the left
	    of	the  function-call operator, argument-dependent lookup is inhib-
     ited.

	In practice, they may be implemented as function objects, or  with  spe-
     cial compiler
	extensions.

Parameters
	first - the beginning of the range of elements to modify
	n     - number of elements to modify
	value - the value to be assigned

Return value
	An output iterator that compares equal to first + n.

Complexity
	Exactly n assignments.

Possible implementation
	struct fill_n_fn
	{
	    template<class O, class T = std::iter_value_t<O>>
	    requires std::output_iterator<O, const T&>
	    constexpr  O  operator()(O first, std::iter_difference_t<O> n, const
     T& value) const
	    {
		for (std::iter_difference_t<O> i {}; i != n; ++first, ++i)
		    *first = value;
		return first;
	    }
	};

	inline constexpr fill_n_fn fill_n {};

Notes
		  Feature-test macro	       Value	Std		 Feature
	__cpp_lib_algorithm_default_value_type 202403  (C++26)	List-initializa-
     tion for
							      algorithms

Example
     // Run this code

      #include <algorithm>
      #include <complex>
      #include <iostream>
      #include <string>
      #include <vector>

      void println(const auto& v)
      {
	  for (const auto& elem : v)
	      std::cout << ' ' << elem;
	  std::cout << '\n';
      }

      int main()
      {
	  constexpr auto n{8};

	  std::vector<std::string> v(n, "aaaa");
	  println(v);

	  std::ranges::fill_n(v.begin(), n, "aaaa");
	  println(v);

	  std::vector<std::complex<double>> nums{{1, 3}, {2, 2}, {4, 8}};
	  println(nums);
	  #ifdef __cpp_lib_algorithm_default_value_type
	      std::ranges::fill_n(nums.begin(), 2, {4, 2});
	  #else
	      std::ranges::fill_n(nums.begin(), 2, std::complex<double>{4, 2});
	  #endif
	  println(nums);
      }

Output:
       aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa
       aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa
       (1,3) (2,2) (4,8)
       (4,2) (4,2) (4,8)

See also
	ranges::fill		assigns a range of elements a certain value
	(C++20) 		(niebloid)
	ranges::copy_n		copies a number of elements to a new location
	(C++20) 		(niebloid)
	ranges::generate	saves the result of a function in a range
	(C++20) 		(niebloid)
	ranges::transform	applies a function to a range of elements
	(C++20) 		(niebloid)
	ranges::generate_random fills a range with random numbers from a uniform
     random bit
	(C++26) 		generator
				(niebloid)
	fill_n			 copy-assigns the given value to N elements in a
     range
				(function template)

http://cppreference.com 	   2024.06.10		  std::ranges::fill_n(3)

home | help