std::fill_n
(on partitioned ranges)
<algorithm>
class T = typename std::iterator_traits
<OutputIt>::value_type >
constexpr OutputIt fill_n( OutputIt first, Size count,
class ForwardIt, class Size, class T >
ForwardIt fill_n( ExecutionPolicy&& policy,
class ForwardIt, class Size,
class T = typename std::iterator_traits
<OutputIt>::value_type >
ForwardIt fill_n( ExecutionPolicy&& policy,
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 any of the following conditions is satisfied, the program is ill-formed:
Size
is not convertible to an integral type.
OutputIt
must meet the requirements of LegacyOutputIterator.
ForwardIt
must meet the requirements of LegacyForwardIterator.
Iterator one past the last element assigned if count > 0, first otherwise.
Exactly std::max (0, count) assignments.
The overload with a template parameter named ExecutionPolicy
reports errors as follows:
ExecutionPolicy
is one of the standard policies, std::terminate is called. For any other ExecutionPolicy
, the behavior is implementation-defined.
fill_n |
---|
template<class OutputIt, class Size, class T = typename std::iterator_traits <OutputIt>::value_type> OutputIt fill_n(OutputIt first, Size count, const T& value) { for (Size i = 0; i < count; i++) *first++ = value; return first; } |
Feature-test macro | Value | Std | Feature |
---|---|---|---|
__cpp_lib_algorithm_default_value_type |
202403 |
(C++26) | List-initialization for algorithms (1,2) |
#include <algorithm> #include <complex> #include <iostream> #include <iterator> #include <vector> int main() { std::vector <int> v1{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; // replace values of the first 5 elements with -1 std::fill_n(v1.begin(), 5, -1); std::copy_n (v1.cbegin(), v1.size(), std::ostream_iterator <int>(std::cout, " ")); std::cout << '\n'; std::vector <std::complex <double>> nums{{1, 3}, {2, 2}, {4, 8}}; #ifdef __cpp_lib_algorithm_default_value_type std::fill_n(nums.begin(), 2, {4, 2}); #else std::fill_n(nums.begin(), 2, std::complex <double>{4, 2}); #endif std::copy_n (nums.cbegin(), nums.size(), std::ostream_iterator <std::complex <double>>(std::cout, " ")); std::cout << '\n'; }
Output:
-1 -1 -1 -1 -1 5 6 7 8 9 (4,2) (4,2) (4,8)
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 283 | C++98 | T was required to be CopyAssignable, butT is not always writable to OutputIt
|
required to be writable instead |
LWG 426 | C++98 | the complexity requirement was "exactly count assignments", which is broken if count is negative |
no assignment if count is non-positive |
LWG 865 | C++98 | the location of the first element following the filling range was not returned |
returned |