3 Stimmen

Verwendung von boost::depth_first_search mit Visitor

Wie der Titel schon sagt, verwende ich boost::depth_first_search und die Verwendung eines Besuchers (geerbt von boost::default_dfs_visitor ), um einen Algorithmus zu implementieren.

Während der Ausführung des Algorithmus möchte ich jedoch einige Informationen im Besucher speichern, um sie später abfragen zu können. Die Informationen werden jedoch nach Beendigung der DFS gelöscht, so dass ich davon ausgehe, dass eine Kopie verwendet wird. Anders als die Verwendung von Zeigern für tous Gibt es eine Möglichkeit, dies zu verhindern und boost zu veranlassen, meine Kopie zu verwenden?

2voto

Björn Pollex Punkte 72424

Sie könnten versuchen, Ihren Besucher in einer boost::reference_wrapper .

Bearbeiten - teh codez

YourVisitorClass your_visitor;
boost::depth_first_search(your_graph, boost::ref(your_visitor), 
                          your_color_map);

boost::ref(your_visitor) gibt eine boost::reference_wrapper<YourVisitorClass> . Wenn depth_first_search eine Kopie dieses Arguments erstellt, wird anstelle des Besucherobjekts der reference_wrapper kopiert. Kopien der Referenz verweisen auf dieselbe Instanz wie das Original.

0 Stimmen

@Amir: Ich kenne deinen Code nicht, aber ich habe mir etwas ausgedacht, das verständlich sein sollte.

0 Stimmen

Scheint nicht zu funktionieren. Früher habe ich boost::depth_first_search(g, boost:visitor(myVisitor)) und versuchte, es zu ändern in boost::depth_first_search(g, boost::ref(boost:visitor(myVisitor))) o boost::depth_first_search(g, boost:visitor(boost::ref(myVisitor))) und beides hat nicht funktioniert (wurde nicht kompiliert).

0 Stimmen

@Amir: Bitte posten Sie den Fehler, den Sie erhalten. Und vielleicht auch den entsprechenden Code (bitte nicht in einem Kommentar, fügen Sie ihn zu Ihrer Frage hinzu).

1voto

ravenspoint Punkte 16577

Ist es wirklich sinnvoll, dass die Informationen Teil des Besuchers sind?

Ich vermute, dass diese Informationen logischerweise zum Diagramm gehören und dort gespeichert werden sollten, nicht im Besucher.

Sie können einen Verweis auf das Diagramm im Besucher speichern. Wenn der Besucher dann das Diagramm durchläuft, kann er die mit dem Diagramm gespeicherten Informationen aktualisieren.

Das Ergebnis ist, dass es in Ordnung ist, den Besucher zu zerstören, wenn seine Arbeit getan ist, da die Ergebnisse als Teil des Diagramms bestehen bleiben.

0 Stimmen

Da ich die Diagrammklasse nicht ändern kann, kann ich ihr auch keine neuen Daten hinzufügen. Außerdem ist das Diagramm im gesamten Programm vorhanden und die Daten, die ich vom Besucher benötige, werden nur in einer Funktion benötigt und dann gelöscht.

0 Stimmen

@Amir. Es gibt zwei Möglichkeiten. Sie könnten eine neue Spezialisierung der Graphklasse erstellen, die das Verhalten des Graphen erbt und das von Ihnen benötigte neue Verhalten hinzufügt. Alternativ können Sie eine ganz neue Klasse erstellen, die Ihre "eine Funktion" und die dafür benötigten Daten enthält, und dann eine Instanz der neuen Klasse erstellen und einen Verweis darauf in Ihrem Besucher speichern. IMHO wäre beides eine logischere Art, die Dinge zu arrangieren, die einfacher zu verstehen und zu pflegen wäre. Außerdem wird das Design des Besuchers nicht durch die Verwendung einer obskuren Boost-Syntax "gebrochen"!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X