2012-12-20 5 views
6

Ich baue eine std::list von Elementen (Graph Komponentenstrukturen), die periodisch zusammengeführt werden. Die Idee ist, wenn ich einen Knoten entdecke, der zwei Komponenten verbindet, werden sie eine einzige Komponente und meine Liste zählt meine Komponenten auf. Jede Komponente hat eine Handle (in diesem Fall eine std::list<component>::iterator) zu seiner "übergeordneten" Komponente, die festgelegt wird, sobald es zusammengeführt wird. Auf diese Weise kann ich feststellen, zu welcher Komponente ein bestimmter Knoten gehört.Entfernen Sie das Element in std :: list, während es zugewiesen bleibt

Am Ende, was ich suche, ist der Betrieb auf std::list, die ich einen Iterator von Artikel N, nehmen kann und entfernen Sie sich aus der Liste, aber ohne es Aufheben der Zuordnung: die Struktur des Restes der Liste wird genau so modifiziert, wie es normalerweise entfernt wird.

Vorzugsweise etwas weniger hässlich als die Neuzuweisung des Elements, Kopieren aus der Liste und Aufruf der echten remove oder erase.

Vielleicht kann ich es mit splice erreichen. Ich müsste die zu entfernenden Elemente zu einem "Müll" list spleißen, oder?

+5

'splice'-in eine _junk-Liste_ klingt nach rechts ... –

+0

Und solch ein Ansatz hat die unwahrscheinliche Möglichkeit, dass die Verwendung von inkompatiblen Allokatoren das Kopieren erzwingen würde. Trotzdem ... gibt es ein paar zusätzliche Hinweise, die gemischt werden. Nun ... tut mir nicht weh * eine Möglichkeit zu haben, über meine nicht vollständig verwaisten Knoten zu iterieren. –

+0

Warum ist die Verwendung der Liste anstelle der Liste nicht für Sie geeignet? –

Antwort

1

Sie können dies mit Spleiß tun. Zum Beispiel bewegen *it auf Junk-Liste:

junk.splice(junk.begin(),comp_list,it); 

Sie können auch move-Ctor zu component hinzuzufügen. Dann, bevor Sie aus der Liste verschieben Inhalt zu löschen var, um so etwas tmp:

component tmp(*it); 
li.erase(it); 

Auch Vorschlag von Fomin Arseniy verwenden Liste von Zeigern zu den Komponenten (oder std::shared_ptr) ist auch gut.

+0

Eine einfache 'liste ' führt wahrscheinlich zu mehr manueller Buchführung als nötig, aber 'liste >' ist wahrscheinlich ein solider Ansatz. Ich wollte die Dinge einfach halten: Mit dem Junk-List-Ansatz vermeide ich es, das Schlüsselwort "new" zu schreiben. –

Verwandte Themen