Einfache Möglichkeit zum hinzufügen von Elementen aus einer Liste in die andere Liste
Was ist der "richtige" Weg, um alle Elemente aus einem std::list zu einen anderen?
void
Node::addChilds(const NodeList *list)
{
for(NodeList::const_iterator i = list->begin();
i != list->end();
++i)
{
this->m_childs.push_back(*i);
}
}
Dachte ich über std::copy (kopieren, aber afaik für die Kopie habe ich, um die Größe der Ziel-Liste, die Sicherung der Ende-iterator (vor resize) etc.
Ich bin auf der Suche für ein single-line-Anweisung.
Was ist
NodeList
? Wie ist m_childs
erklärt?InformationsquelleAutor cytrinox | 2010-11-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden
back_insert_iterator
. Wennstd::list<T>
ist die Art derm_childs
,Ich hätte gedacht, dass member-Funktion
list::insert
effizienter wäre. Keine Ahnung, ob das stimmt?Auf Linux/x86 läuft auf einem Intel Core2 @1,86 GHz, GCC 4.3.2, füllen eine Liste mit 10000000 Elemente, die das kopieren auf eine andere Liste und drucken das zweite element nimmt ca. 2,5 s wall-clock time, 2.1 s Benutzer, unabhängig davon, ob
copy
oderinsert
verwendet wird.InformationsquelleAutor Fred Foo
InformationsquelleAutor ybungalobill
Wenn die Elemente verschoben werden sollen, können Sie splice. Andernfalls kopieren Sie, wie bereits erläutert, durch ybungalobill oder larsmans.
InformationsquelleAutor SebastianK
Scott Meyers schreibt über dieses spezielle Thema in "effective STL", in Punkt 5 (und erwähnt
splice
im Punkt 4). Er bevorzugt ybungalobill version, sondern vor allem, weil er meint, der code wird sauberer und klarer, da es betont das Wort 'insert' und nicht das Wort 'copy'.Fast alle Verwendungen von
std::copy
verwendet einen iterator (wieback_inserter
) kann ersetzt werden durch Aufrufe Reihe member-Funktionen (wie.insert(position, begin, end)
).splice
ist eine Konstante-time-member-Funktion, so wird es schneller sein, wenn es gilt, in diesem speziellen Fall.InformationsquelleAutor AzP