Namespaces
Variants

std::inplace_vector<T,N>::inplace_vector

Von de.cppreference.net
 
 
 
 
constexpr inplace_vector() noexcept;
(1) (seit C++26)
constexpr explicit inplace_vector( size_type count );
(2) (seit C++26)
constexpr inplace_vector( size_type count, const T& value );
(3) (seit C++26)
template< class InputIt >
constexpr inplace_vector( InputIt first, InputIt last );
(4) (seit C++26)
template< /*container-compatible-range*/<T> R >
constexpr inplace_vector( std::from_range_t, R&& rg );
(5) (seit C++26)
constexpr inplace_vector( const inplace_vector& other );
(6) (seit C++26)
constexpr inplace_vector( inplace_vector&& other )
    noexcept(N == 0 || std::is_nothrow_move_constructible_v<T>);
(7) (seit C++26)
constexpr inplace_vector( std::initializer_list<T> init );
(8) (seit C++26)

Konstruiert einen neuen inplace_vector aus verschiedenen Datenquellen.

1) Konstruiert einen leeren inplace_vector.
2) Konstruiert einen inplace_vector mit count wertinitialisierten Elementen.
3) Konstruiert einen inplace_vector mit count Kopien von Elementen mit Wert value.
4) Konstruiert einen inplace_vector mit dem Inhalt des Bereichs [first, last).
5) Konstruiert einen inplace_vector mit dem Inhalt des Bereichs rg.
Für die Definition von /*container-compatible-range*/ siehe ranges::to.
Das Programm ist fehlerhaft, wenn ranges::size(rg) ein konstanter Ausdruck ist und größer als N ist.
6) Kopierkonstruktor. Konstruiert einen inplace_vector mit der Kopie des Inhalts von other.
Der Konstruktor ist trivial, wenn N > 0 und std::is_trivially_copy_constructible_v<T> beide true sind.
7) Verschiebekonstruktor. Konstruiert einen inplace_vector mit dem Inhalt von other unter Verwendung der Verschiebesemantik.
Der Konstruktor ist trivial, wenn N > 0 und std::is_trivially_move_constructible_v<T> beide true sind.
8) Konstruiert einen inplace_vector mit dem Inhalt der Initialisierungsliste init.

Parameter

count - die Größe des Containers
value - der Wert, mit dem Elemente des Containers initialisiert werden
first, last - das Iteratorpaar, das den Quell- Bereich der zu kopierenden Elemente definiert
rg - der Wertebereich, mit dem Elemente des Containers initialisiert werden
other - ein weiterer inplace_vector , der als Quelle zur Initialisierung der Containerelemente verwendet wird
init - Initialisierungsliste zur Initialisierung der Containerelemente
Typanforderungen
-
T muss die Anforderungen von DefaultInsertable erfüllen, um die Überladungen (2,3) verwenden zu können.

Komplexität

1) Konstante.
2,3) Linear in count .
4) Linear in std:: distance ( first, last ) .
5) Linear in std :: ranges:: distance ( rg ) .
6,7) Linear in der Größe von other .
8) Linear in der Größe von init .

Ausnahmen

2,3) Wirft std::bad_alloc falls count > N .
5) Wirft std::bad_alloc falls std :: ranges:: size ( rg ) > N .
8) Wirft std::bad_alloc falls init. size ( ) > N .

Beispiel

#include <cassert>
#include <initializer_list>
#include <inplace_vector>
#include <new>
#include <print>
#include <ranges>

int main()
{
    std::inplace_vector<int, 4> v1; // overload (1)
    assert(v1.size() == 0 && v1.capacity() == 4);
    
    std::inplace_vector<int, 0> v2; // overload (1), N == 0 is allowed
    assert(v2.size() == 0 && v2.capacity() == 0);
    
    std::inplace_vector<int, 5> v3(3); // overload (2)
    assert(v3.size() == 3 && v3.capacity() == 5);
    std::println("v3 = {}", v3);
    
    try
    {
        std::inplace_vector<int, 3> v(4); // overload (2), throws: count > N
    }
    catch(const std::bad_alloc& ex1)
    {
        std::println("ex1.what(): {}", ex1.what());
    }
    
    std::inplace_vector<int, 5> v4(3, 42); // overload (3)
    assert(v4.size() == 3 && v4.capacity() == 5);
    std::println("v4 = {}", v4);
    
    try
    {
        std::inplace_vector<int, 3> v(4, 2); // overload (3), throws: count > N
    }
    catch(const std::bad_alloc& ex2)
    {
        std::println("ex2.what(): {}", ex2.what());
    }
    
    const auto init = {1, 2, 3};
    
    std::inplace_vector<int, 4> v5(init.begin(), init.end()); // overload (4)
    assert(v5.size() == 3 && v5.capacity() == 4);
    std::println("v5 = {}", v5);
    
    std::inplace_vector<int, 4> v6(std::from_range, init); // overload (5)
    assert(v6.size() == 3 && v6.capacity() == 4);
    std::println("v6 = {}", v6);
    
    std::inplace_vector<int, 4> v7(v6); // overload (6)
    assert(v7.size() == 3 && v7.capacity() == 4);
    std::println("v7 = {}", v7);
    assert(v6.size() == 3);
    
    std::inplace_vector<int, 4> v8(std::move(v6)); // overload (7)
    // Note that after the move v6 is left in valid but indeterminate state.
    assert(v8.size() == 3 && v8.capacity() == 4);
    std::println("v8 = {}", v8);
    
    std::inplace_vector<int, 4> v9(init); // overload (8)
    assert(v9.size() == 3 && v9.capacity() == 4);
    std::println("v9 = {}", v9);
    
    try
    {
        std::inplace_vector<int, 2> v(init); // overload (8), throws: init.size() > N
    }
    catch(const std::bad_alloc& ex3)
    {
        std::println("ex3.what(): {}", ex3.what());
    }
}

Mögliche Ausgabe:

v3 = [0, 0, 0]
ex1.what(): std::bad_alloc
v4 = [42, 42, 42]
ex2.what(): std::bad_alloc
v5 = [1, 2, 3]
v6 = [1, 2, 3]
v7 = [1, 2, 3]
v8 = [1, 2, 3]
v9 = [1, 2, 3]
ex3.what(): std::bad_alloc

Siehe auch

weist dem Container Werte zu
(öffentliche Elementfunktion)
[static]
gibt die Anzahl der Elemente zurück, die im aktuell allozierten Speicherplatz gehalten werden können
(öffentliche statische Elementfunktion)
direkter Zugriff auf den zugrundeliegenden zusammenhängenden Speicher
(öffentliche Elementfunktion)
gibt die Anzahl der Elemente zurück
(öffentliche Elementfunktion)
(C++17) (C++20)
gibt die Größe eines Containers oder Arrays zurück
(Funktionstemplate)
(C++17)
erhält den Zeiger auf das zugrundeliegende Array
(Funktionstemplate)