Namensräume
Varianten
Aktionen

std::deque<T,Allocator>::emplace

Von cppreference.com
< cpp‎ | container‎ | deque
 
 
 
 
template< class... Args >
iterator emplace( const_iterator pos, Args&&... args );
(seit C++11)

Fügt ein neues Element direkt vor pos in den Container ein.

Das Element wird über std::allocator_traits::construct konstruiert, welche typischerweise Placement new verwendet, um das Element an einem vom Container bereitgestellten Ort an Ort und Stelle zu konstruieren. Wenn jedoch der benötigte Ort bereits von einem vorhandenen Element belegt ist, wird das eingefügte Element zunächst an einem anderen Ort konstruiert und dann per Move-Zuweisung an den benötigten Ort verschoben.

Die Argumente args... werden als std::forward<Args>(args)... an den Konstruktor weitergeleitet. args... dürfen direkt oder indirekt auf einen Wert im Container verweisen.

Alle Iteratoren (einschließlich des end()-Iterators) werden ungültig. Referenzen werden ebenfalls ungültig, es sei denn, pos == begin() oder pos == end(), in diesem Fall werden sie nicht ungültig.

Inhalt

[bearbeiten] Parameter

pos - Iterator, vor dem das neue Element konstruiert wird
args - Argumente, die an den Konstruktor des Elements weitergeleitet werden
Typanforderungen
-
T muss die Anforderungen von MoveAssignable, MoveInsertable und EmplaceConstructible erfüllen.

[bearbeiten] Rückgabewert

Iterator, der auf das eingefügte Element zeigt.

[bearbeiten] Komplexität

Linear in der kleineren der Distanzen zwischen pos und einem der Enden des Containers.

[bearbeiten] Ausnahmen

Wenn eine Ausnahme geworfen wird, die nicht vom Kopierkonstruktor, Move-Konstruktor, Zuweisungsoperator oder Move-Zuweisungsoperator von T geworfen wird, oder wenn eine Ausnahme geworfen wird, während emplace verwendet wird, um ein einzelnes Element am jeweiligen Ende einzufügen, hat dies keine Auswirkungen (starke Ausnahme-Garantie).

Andernfalls sind die Auswirkungen undefiniert.

Beispiel

#include <iostream>
#include <string>
#include <deque>
 
struct A
{
    std::string s;
 
    A(std::string str) : s(std::move(str)) { std::cout << " constructed\n"; }
 
    A(const A& o) : s(o.s) { std::cout << " copy constructed\n"; }
 
    A(A&& o) : s(std::move(o.s)) { std::cout << " move constructed\n"; }
 
    A& operator=(const A& other)
    {
        s = other.s;
        std::cout << " copy assigned\n";
        return *this;
    }
 
    A& operator=(A&& other)
    {
        s = std::move(other.s);
        std::cout << " move assigned\n";
        return *this;
    }
};
 
int main()
{
    std::deque<A> container;
 
    std::cout << "construct 2 times A:\n";
    A two{"two"};
    A three{"three"};
 
    std::cout << "emplace:\n";
    container.emplace(container.end(), "one");
 
    std::cout << "emplace with A&:\n";
    container.emplace(container.end(), two);
 
    std::cout << "emplace with A&&:\n";
    container.emplace(container.end(), std::move(three));
 
    std::cout << "content:\n";
    for (const auto& obj : container)
        std::cout << ' ' << obj.s;
    std::cout << '\n';
}

Ausgabe

construct 2 times A:
 constructed
 constructed
emplace:
 constructed
emplace with A&:
 copy constructed
emplace with A&&:
 move constructed
content:
 one two three

[bearbeiten] Fehlerberichte

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 2164 C++11 war unklar, ob die Argumente auf den Container verweisen können wurde klargestellt

[bearbeiten] Siehe auch

fügt Elemente ein
(public member function) [edit]
konstruiert ein Element direkt (in-place) am Ende
(public member function) [edit]