2012-04-09 10 views
5

Sagen wir, ich schreibe Dijkstra's Algorithm, und ich habe eine Prioritätswarteschlange, die den Knoten mit der kürzesten Entfernung an der Spitze hält. Wenn ich jedoch den Graph durchquere, werde ich den Abstand zu diesem Eckpunkt aktualisieren. Ich habe Verweise auf alle Scheitelpunkte in der Prioritätswarteschlange platziert, die in der Datenstruktur enthalten sind. Wenn ich nun die Scheitelpunkte in der Datenstruktur aktualisiere, möchte ich, dass sich die Daten in der Prioritätswarteschlange an diese Änderungen anpassen, sodass der nächste Knoten immer oben ist. Nach dem Durchlaufen meiner Anwendung mit dem Debugger habe ich jedoch bemerkt, dass die Prioritätswarteschlange sich nicht selbst aktualisiert. Wie bekomme ich es dazu, ohne alle Scheitelpunkte wieder einzufügen?STL-Prioritätswarteschlange aktualisieren, wenn Verweise auf interne Daten geändert werden

Antwort

4

STL priority_queue setzt voraus, dass Sie nur die Methoden push() und pop() verwenden, um die Datenstruktur zu ändern. Änderungen an der Datenstruktur werden nicht verfolgt.

Nachdem Sie das Innere des zugrunde liegenden Containers der priority_queue geändert haben, müssen Sie make_heap() für den Container aufrufen, um die Heap-Eigenschaft wiederherzustellen. STL priority_queue stellt keine Iteratoren für den zugrunde liegenden Container bereit. Stattdessen müssen Sie eine Deque oder einen Vektor manuell als Prioritätswarteschlange verwalten und make_heap(), push_heap() und pop_heap() bei Bedarf aufrufen.

+1

Entweder dies oder schreiben Sie Ihre eigene Implementierung, da Sie wissen, welche Elemente geändert wurden, und make_heap() nicht. –

+0

@MtnViewJohn haben Sie eine funktionierende Probe? Oder ein Snip-Bit Code? Brauche kein vollständiges Ding, nur ein sehr kleines Beispiel. –

+0

Hier ist ein [Link] [1] zu SGIs Implementierung von priority_queue. Sie können dies kopieren und um eine Fixup-Methode erweitern, die make_heap() aufruft, um den Heap zu reparieren, nachdem der Inhalt geändert wurde. @NathanS Vorschlag ist auch sehr gut: Wenn Sie jeden Knoten ändern, führen Sie sofort die notwendigen Heap-Rotate-Operationen durch, um die Heap-Eigenschaft zu erhalten. [1] http://www.sgi.com/tech/stl/stl_queue.h – MtnViewJohn