std::ranges::uninitialized_fill
From cppreference.com
| Defined in header <memory>
|
||
| Call signature |
||
template< /*nothrow-forward-iterator*/ I, /*nothrow-sentinel-for*/<I> S,
class T >
requires std::constructible_from<std::iter_value_t<I>, const T&>
I uninitialized_fill( I first, S last, const T& value );
|
(1) | (since C++20) (constexpr since C++26) |
template< /*nothrow-forward-range*/ R, class T >
requires std::constructible_from<ranges::range_value_t<R>, const T&>
ranges::borrowed_iterator_t<R> uninitialized_fill( R&& r,
const T& value );
|
(2) | (since C++20) (constexpr since C++26) |
template< /*execution-policy*/ Ep, /*nothrow-random-access-iterator*/ I,
/*nothrow-sized-sentinel-for*/<I> S,
class T = std::iter_value_t<I> >
requires constructible_from<std::iter_value_t<I>, const T&>
I uninitialized_fill( Ep&& policy, I first, S last, const T& value );
|
(3) | (since C++26) |
template< /*execution-policy*/ Ep, /*nothrow-sized-random-access-range*/ R,
class T = ranges::range_value_t<R> >
requires std::constructible_from<ranges::range_value_t<R>, const T&>
ranges::borrowed_iterator_t<R> uninitialized_fill( Ep&& policy, R&& r,
const T& value );
|
(4) | (since C++26) |
For the definition of /*execution-policy*/, see this page; for the definition of other exposition-only concepts, see this page.
1) Constructs elements in the destination range
[first, last) with the given value value as if by
for (; first != last; ++first)
::new (voidify(*first)) std::remove_reference_t<std::iter_reference_t<I>>(value);
return first;
If an exception is thrown during the initialization, the objects already constructed are destroyed in an unspecified order.
2) Same as (1), but uses
r as the destination range.3,4) Same as (1,2), but executed according to
policy.The function-like entities described on this page are algorithm function objects (informally known as 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 inhibited.
Parameters
| first, last | - | the iterator-sentinel pair defining the range of elements to initialize |
| r | - | the range of the elements to initialize |
| value | - | the value to construct the elements with |
| policy | - | the execution policy to use |
Return value
As described above.
Exceptions
Any exception thrown on construction of the elements in the destination range.
3,4) During the execution process:
- If the temporary memory resources required for parallelization are not available, std::bad_alloc is thrown.
- If an uncaught exception is thrown while accessing objects via an algorithm argument, the behavior is determined by the execution policy (for standard policies, std::terminate is invoked).
Notes
An implementation may improve the efficiency of the ranges::uninitialized_fill (by using e.g. ranges::fill) if the value type of the output range is TrivialType.
| Feature-test macro | Value | Std | Feature |
|---|---|---|---|
__cpp_lib_parallel_algorithm |
202506L |
(C++26) | Parallel range algorithms |
__cpp_lib_raw_memory_algorithms |
202411L |
(C++26) | constexpr for specialized <memory> algorithms, (1,2)
|
Possible implementation
struct uninitialized_fill_fn
{
template</*nothrow-forward-iterator*/ I, /*nothrow-sentinel-for*/<I> S, class T>
requires std::constructible_from<std::iter_value_t<I>, const T&>
constexpr I operator()(I first, S last, const T& value) const
{
I rollback{first};
try
{
for (; !(first == last); ++first)
ranges::construct_at(std::addressof(*first), value);
return first;
}
catch (...)
{
// rollback: destroy constructed elements
for (; rollback != first; ++rollback)
ranges::destroy_at(std::addressof(*rollback));
throw;
}
}
template</*nothrow-forward-range*/ R, class T>
requires std::constructible_from<ranges::range_value_t<R>, const T&>
constexpr ranges::borrowed_iterator_t<R> operator()(R&& r, const T& value) const
{
return (*this)(ranges::begin(r),
ranges::next(ranges::begin(r), ranges::end(r)), value);
}
};
inline constexpr uninitialized_fill_fn uninitialized_fill{};
|
Example
Run this code
#include <iostream>
#include <memory>
#include <string>
int main()
{
constexpr int n{4};
alignas(alignof(std::string)) char out[n * sizeof(std::string)];
try
{
auto first{reinterpret_cast<std::string*>(out)};
auto last{first + n};
std::ranges::uninitialized_fill(first, last, "▄▀▄▀▄▀▄▀");
int count{1};
for (auto it{first}; it != last; ++it)
std::cout << count++ << ' ' << *it << '\n';
std::ranges::destroy(first, last);
}
catch(...)
{
std::cout << "Exception!\n";
}
}
Output:
1 ▄▀▄▀▄▀▄▀
2 ▄▀▄▀▄▀▄▀
3 ▄▀▄▀▄▀▄▀
4 ▄▀▄▀▄▀▄▀
See also
(C++20) |
copies an object to an uninitialized area of memory, defined by a start and a count (algorithm function object) |
| copies an object to an uninitialized area of memory, defined by a range (function template) |