Spec-Zone.ru › C++

std::ranges::uninitialized_fill_n

Defined in header <memory>
Call signature
template< /*nothrow-forward-iterator*/ I, class T >
    requires std::constructible_from<std::iter_value_t<I>, const T&>
I uninitialized_fill_n( I first, std::iter_difference_t<I> count,
                        const T& value );
(1) (since C++20)
(constexpr since C++26)
template< /*execution-policy*/ Ep, /*nothrow-random-access-iterator*/ I,
          class T = std::iter_value_t<I> >
    requires std::constructible_from<std::iter_value_t<I>, const T&>
I uninitialized_fill_n( Ep&& exec, I first, std::iter_difference_t<I> count,
                        const T& value );
(2) (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 + [0, count) with the given value value as if by

return ranges::uninitialized_fill(std::counted_iterator(first, count),                                   std::default_sentinel, value).base();

If an exception is thrown during the initialization, the objects already constructed are destroyed in an unspecified order.
2) Same as (1), 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 - the beginning of the range of the elements to initialize
count - number of elements to construct
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.

2) 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_n (by using e.g. ranges::fill_n) 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)

Possible implementation

struct uninitialized_fill_n_fn
{
    template</*nothrow-forward-range*/ I, class T>
        requires std::constructible_from<std::iter_value_t<I>, const T&>
    constexpr I operator()(I first, std::iter_difference_t<I> count,
                           const T& value) const
    {
        I rollback{first};
        try
        {
            for (; count-- > 0; ++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;
        }
    }
};

inline constexpr uninitialized_fill_n_fn uninitialized_fill_n{};

Example

#include <iostream>
#include <memory>
#include <string>

int main()
{
    constexpr int n{3};
    alignas(alignof(std::string)) char out[n * sizeof(std::string)];
    
    try
    {
        auto first{reinterpret_cast<std::string*>(out)};
        auto last = std::ranges::uninitialized_fill_n(first, n, "cppreference");
        
        for (auto it{first}; it != last; ++it)
            std::cout << *it << '\n';
        
        std::ranges::destroy(first, last);
    }
    catch (...)
    {
        std::cout << "Exception!\n";
    }
}

Output:

cppreference
cppreference
cppreference

See also

ranges::uninitialized_fill
(C++20)
copies an object to an uninitialized area of memory, defined by a range
(algorithm function object)
uninitialized_fill_n
copies an object to an uninitialized area of memory, defined by a start and a count
(function template)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/memory/ranges/uninitialized_fill_n

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API