Namespaces
Variants

std::ranges::uninitialized_fill_n

Von de.cppreference.net
 
 
Algorithmenbibliothek
Eingeschränkte Algorithmen und Algorithmen auf Bereichen (C++20)
Eingeschränkte Algorithmen, z.B. ranges::copy, ranges::sort, ...
Nicht modifizierende Sequenzoperationen    
Stapeloperationen
(C++17)
Suchoperationen
Modifizierende Sequenzoperationen
Kopieroperationen
(C++11)
(C++11)
Tauschoperationen
Transformationsoperationen
Generierungsoperationen
Entfernungsoperationen
Reihenfolgeänderungsoperationen
(bis C++17)(C++11)
(C++20)(C++20)
Stichprobenoperationen
(C++17)

Sortier- und verwandte Operationen
Partitionierungsoperationen
(C++11)    

Sortieroperationen
Binäre Suchoperationen
(auf partitionierten Bereichen)
Mengenoperationen (auf sortierten Bereichen)
Mischoperationen (auf sortierten Bereichen)
Heap-Operationen
Minimum/Maximum-Operationen
(C++11)
(C++17)
Lexikografische Vergleichsoperationen
Permutationsoperationen


 
 
Definiert in Header <memory>
Aufrufsignatur
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) (seit C++20)
(constexpr seit 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) (seit C++26)

Für die Definition von /*execution-policy*/ siehe diese Seite; für die Definition anderer reiner Darstellungskonzepte siehe diese Seite.

1) Konstruiert Elemente im Zielbereich first + [0, count) mit dem gegebenen Wert value wie durch

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

Wenn während der Initialisierung eine Ausnahme ausgelöst wird, werden die bereits konstruierten Objekte in einer nicht spezifizierten Reihenfolge zerstört.
2) Gleich wie (1), aber ausgeführt gemäß policy.

Die auf dieser Seite beschriebenen funktionsähnlichen Entitäten sind Algorithmus-Funktionsobjekte (informell bekannt als Niebloids), das heißt:

Parameter

first - der Beginn des Bereichs der zu initialisierenden Elemente
count - Anzahl der zu konstruierenden Elemente
value - der Wert, mit dem die Elemente konstruiert werden
policy - die execution policy zu verwenden

Rückgabewert

Wie oben beschrieben.

Ausnahmen

Jede Ausnahme, die bei der Konstruktion der Elemente im Zielbereich ausgelöst wird.

2) Während des Ausführungsprozesses:
  • Falls die für die Parallelisierung erforderlichen temporären Speicherressourcen nicht verfügbar sind, wird std::bad_alloc ausgelöst.
  • Falls beim Zugriff auf Objekte über ein Algorithmusargument eine nicht gefangene Ausnahme ausgelöst wird, wird das Verhalten durch die Ausführungsrichtlinie bestimmt (für Standardrichtlinien, wird std::terminate aufgerufen).

Anmerkungen

Eine Implementierung kann die Effizienz der ranges::uninitialized_fill_n verbessern (z. B. durch Verwendung von ranges::fill_n), wenn der Werttyp des Ausgabebereichs TrivialType ist.

Feature-Test Makro Wert Std Feature
__cpp_lib_parallel_algorithm 202506L (C++26) Parallele Range-Algorithmen
__cpp_lib_raw_memory_algorithms 202411L (C++26) constexpr für spezialisierte <memory> Algorithmen, (1)

Mögliche Implementierung

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{};

Beispiel

#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";
    }
}

Ausgabe:

cppreference
cppreference
cppreference

Siehe auch

kopiert ein Objekt in einen nicht initialisierten Speicherbereich, der durch einen Bereich definiert ist
(Algorithmus-Funktionsobjekt)
kopiert ein Objekt in einen nicht initialisierten Speicherbereich, der durch einen Start und eine Anzahl definiert ist
(Funktionstemplate)