Namespaces
Variants

std::ranges::uninitialized_default_construct_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)
Swap-Operationen
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)
Merge-Operationen (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 >
    requires std::default_initializable<std::iter_value_t<I>>
I uninitialized_default_construct_n( I first,
                                     std::iter_difference_t<I> count );
(1) (seit C++20)
(constexpr seit C++26)
template< /*execution-policy*/ Ep, /*nothrow-random-access-iterator*/ I >
    requires std::default_initializable<std::iter_value_t<I>>
I uninitialized_default_construct_n( Ep&& policy, I first,
                                     std::iter_difference_t<I> count );
(2) (seit C++26)

Für die Definition von /*execution-policy*/ siehe diese Seite; für die Definition anderer Konzepte, die nur zur Darstellung dienen, siehe diese Seite.

1) Konstruiert Elemente im Zielbereich first + [0count) durch Standardinitialisierung wie durch

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

Wenn während der Initialisierung eine Ausnahme ausgelöst wird, werden die bereits konstruierten Objekte in einer nicht festgelegten 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 als Niebloids bekannt), das heißt:

Parameter

erster - der Beginn des Bereichs der zu initialisierenden Elemente
Anzahl - die Anzahl der zu konstruierenden Elemente
Richtlinie - die Ausführungsrichtlinie 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, std::bad_alloc wird geworfen.
  • Falls eine nicht gefangene Ausnahme ausgelöst wird, während auf Objekte über ein Algorithmusargument zugegriffen wird, wird das Verhalten durch die Ausführungsrichtlinie bestimmt (für Standardrichtlinien, std::terminate wird aufgerufen).

Anmerkungen

Eine Implementierung kann die Objektkonstruktion überspringen (ohne den beobachtbaren Effekt zu ändern), wenn beim Standard-Initialisieren eines std::iter_value_t<I>-Objekts kein nicht-trivialer Standardkonstruktor aufgerufen wird, was mit std::is_trivially_default_constructible erkannt werden kann.

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

Mögliche Implementierung

struct uninitialized_default_construct_n_fn
{
    template</*nothrow-forward-iterator*/ I>
        requires std::default_initializable<std::iter_value_t<I>>
    constexpr I operator()(I first, std::iter_difference_t<I> count) const
    {
        auto iter = std::counted_iterator(first, count);
        return ranges::uninitialized_default_construct(iter, std::default_sentinel).base();
    }
};

inline constexpr uninitialized_default_construct_n_fn uninitialized_default_construct_n{};

Beispiel

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

int main()
{
    struct S { std::string m{"█▓▒░ █▓▒░ "}; };
    
    constexpr int n{4};
    alignas(alignof(S)) char out[n * sizeof(S)];
    
    try
    {
        auto first{reinterpret_cast<S*>(out)};
        auto last = std::ranges::uninitialized_default_construct_n(first, n);
        
        auto count{1};
        for (auto it{first}; it != last; ++it)
            std::cout << count++ << ' ' << it->m << '\n';
        
        std::ranges::destroy(first, last);
    }
    catch (...)
    {
        std::cout << "Exception!\n";
    }
    
    // For scalar types, uninitialized_default_construct_n
    // generally does not zero-fill the given uninitialized memory area.
    constexpr int sample[]{1, 2, 3, 4, 5, 6};
    int v[]{1, 2, 3, 4, 5, 6};
    std::ranges::uninitialized_default_construct_n(std::begin(v), std::size(v));
    if (std::memcmp(v, sample, sizeof(v)) == 0)
    {
        // Maybe undefined behavior, pending CWG 1997:
        // for (const int i : v) { std::cout << i << ' '; }
        for (const int i : sample)
            std::cout << i << ' ';
    }
    else
        std::cout << "Unspecified!";
    std::cout << '\n';
}

Mögliche Ausgabe:

1 █▓▒░ █▓▒░
2 █▓▒░ █▓▒░
3 █▓▒░ █▓▒░
4 █▓▒░ █▓▒░
1 2 3 4 5 6

Siehe auch

erzeugt Objekte durch Default-Initialisierung in einem nicht initialisierten Speicherbereich, der durch einen Bereich definiert ist
(Algorithmus-Funktionsobjekt)
erzeugt Objekte durch Wertinitialisierung in einem nicht initialisierten Speicherbereich, der durch einen Bereich definiert ist
(Algorithmus-Funktionsobjekt)
erzeugt Objekte durch Wertinitialisierung in einem nicht initialisierten Speicherbereich, der durch einen Start und eine Anzahl definiert ist
(Algorithmus-Funktionsobjekt)
erzeugt Objekte durch Default-Initialisierung in einem nicht initialisierten Speicherbereich, der durch einen Start und eine Anzahl definiert ist
(Funktionstemplate)