2011-01-16 8 views
3

Wie der Titel sagt, verwende ich boost::depth_first_search und mit einem Besucher (erben von boost::default_dfs_visitor), um einige Algorithmen zu implementieren.Verwendung von boost :: depth_first_search mit Besucher

Während des Laufs des Algorithmus möchte ich jedoch einige Informationen im Besucher speichern, um später abgefragt zu werden. Die Information wird jedoch gelöscht, nachdem das DFS fertig ist, also nehme ich an, dass es eine Kopie verwendet. Anders als nur mit Zeigern für alle private Variablen, gibt es eine Möglichkeit, dies zu verhindern und Boost meine Kopie verwenden?

Antwort

1

Macht es wirklich Sinn, dass die Informationen Teil des Besuchers sind?

Meine Vermutung ist, dass die Informationen logisch mit der Grafik gehören, und sollte dort gespeichert werden, nicht im Besucher.

Sie können einen Verweis auf die Grafik im Besucher speichern. Wenn der Besucher den Graphen durchläuft, kann er die mit dem Graph gespeicherten Informationen aktualisieren.

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

+0

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

+0

@Amir. Es gibt zwei Möglichkeiten. Sie könnten eine neue Spezialisierung der Diagrammklasse erstellen, die das Diagrammverhalten erbt und das neue Verhalten hinzufügt, das Sie benötigen. Alternativ können Sie eine brandneue Klasse erstellen, die Ihre "eine Funktion" und die benötigten Daten enthält. Anschließend erstellen Sie eine Instanz der neuen Klasse und speichern eine Referenz darauf in Ihrem Besucher. Meiner Meinung nach wäre beides eine logischere Art, Dinge zu arrangieren, die einfacher zu verstehen und zu pflegen wären. Außerdem "brechen" sie das Besucherdesign nicht durch die Verwendung einer obskuren Boost-Syntax! – ravenspoint

2

Sie könnten versuchen, Ihren Besucher in einem boost::reference_wrapper verpackt übergeben.

Bearbeiten - teh codez

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

boost::ref(your_visitor) gibt ein boost::reference_wrapper<YourVisitorClass>. Wenn depth_first_search eine Kopie dieser Argumente erstellt, wird der reference_wrapper anstelle des Besucherobjekts kopiert. Kopien der Referenz beziehen sich auf die gleiche Instanz wie das Original.

+0

Können Sie mir zeigen, wie man das schreibt? –

+0

@Amir: Ich kenne Ihren Code nicht, aber ich habe etwas erfunden, das sollte verständlich sein. –

+0

scheint nicht zu funktionieren. Früher habe ich tun 'boost :: depth_first_search (g, boost: Besucher (myVisitor))' und versuchte, es zu ändern, um 'boost :: depth_first_search (g, boost :: ref (boost: Besucher (myVisitor)))' oder ' boost :: depth_first_search (g, boost: visitor (boost :: ref (myVisitor))) 'und beide haben nicht funktioniert (nicht kompiliert). –

Verwandte Themen