Namensräume
Varianten
Aktionen

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

Von cppreference.com
< cpp‎ | container‎ | list
 
 
 
 
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 durch std::allocator_traits::construct konstruiert, welche Placement new verwendet, um das Element an einer vom Container bereitgestellten Stelle zu konstruieren.

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.

Keine Iteratoren oder Referenzen werden 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 EmplaceConstructible erfüllen.

[bearbeiten] Rückgabewert

Iterator, der auf das eingefügte Element zeigt.

[bearbeiten] Komplexität

Konstant.

[bearbeiten] Ausnahmen

Wenn eine Ausnahme ausgelöst wird (z.B. vom Konstruktor), bleibt der Container unverändert, als ob diese Funktion nie aufgerufen worden wäre (starke Ausnahmegarantie).

Beispiel

#include <iostream>
#include <string>
#include <list>
 
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::list<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]