2016-03-24 1 views
0

Betrachten Sie die folgende Folge von Anweisungen std :: listC++: Elemente aus dem STL-Container in eine Variable in einer einzigen Anweisung verschieben?

//class C; 

C c_obj; 
std::list<C> my_list; 

//... 

std::swap(c_obj, my_list.front()); 
my_list.pop_front(); 

Ich möchte einfach den Inhalt von my_list.front bewegen() mit c_obj während das Element aus der Liste in einer einzigen Anweisung zu entfernen (und minimiert so die Anzahl der Anweisungen und des Kopierens). Ist es möglich?

Danke.

+2

Und für den Fall, wenn es eine Ausnahme zwischen Kopieren und zu entfernen? – Steephen

+0

Nein, ich glaube nicht, dass es eine Möglichkeit gibt, 'front()' und 'pop_front()' im selben Ausdruck zu erhalten. Zumindest nicht in der Klasse 'std :: list' – vu1p3n0x

Antwort

0

Erstellen Sie eine Funktion, die den knallte Wert zurückgibt und verwenden std::exchange():

C& pop_front(std::list<C>& cont) { 
    C& c(cont.front()); 
    cont.pop_front(); 
    return c; 
} 

int main() { 
    C c_obj; 
    std::list<C> my_list; 
    my_list.emplace_front(); 

    std::exchange(c_obj, pop_front(my_list)); 
} 
+0

Danke für die Erwähnung von std :: exchange. Ich wusste es nicht. Deine Methode scheint in Ordnung zu sein. Vielen Dank. – booNlatoT

0

Ich glaube nicht wirklich, dass etwas eingebaut ist, dass dies für Sie tun wird. Sie können Ihre eigene Funktion zum Kopieren und dann zum Kopieren schreiben. Wenn Sie wissen, dass Sie diese Funktion wahrscheinlich nicht für viele andere Zwecke verwenden, können Sie einen Lambda-Ausdruck erstellen, so dass es sich wirklich nur um eine Anweisung handelt, die als anonymer Funktionsaufruf getarnt ist.

http://en.cppreference.com/w/cpp/language/lambda

Alternativ können Sie auch eine neue Liste erstellen könnte und dann Spleiß verwenden, um die Elemente einer nach dem anderen zu übertragen, um sicherzustellen, dass nichts den Gültigkeitsbereich verlässt, dann tun nur mit dem Iterator auf das Element in der neue Liste.

Verwandte Themen