Boost Graph Library, Kanten als std::pair<std::string,std::string> Edge;
-
Hallo Leute,
ich versuche gerade mit der Boost Graph Library einen Graphen zu erstellen, dazu
lese ich eine Datei ein die so aussieht:n56 h67 h77 uy6 hg7 ui8 uy6 ghh usw.
Das sind die Kanten im Graph.
In meinem C++ Programm will ich den Graph nun wie folgt erstellen:typedef std::pair<std::string,std::string> Edge; std::vector<Edge> edges; // Beinhaltet die Kanten aus der Datei typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS> Graph; Graph g(edges.begin(),edges.end(),edges.size()*2);
Leider bekomme ich die Fehlermeldung:
'boost::add_edge' : none of the 2 overloads could convert all the argument types
Und dann eine laengere Template Fehlermeldung. Ich vermute das es nicht so einfach ist die Kanten vom Typ:
std::pair<std::string,std::string> Edge
in den Graph einzufuegen. In der Dokumentation habe ich immer gesehen das die Kanten immer als Integer beschrieben werden. Was muss ich aendern dasmit es laeuft?
Besten Dank
-
Ist halt schade, dass Du add_edge nicht in Deinem Code aufgeführt hast. Oder von welcher Deiner Zeilen wird der Fehler ausgelöst?
-
Die Dokumentation ist hier leider widersprüchlich/falsch. Auch wenn an einigen Stellen gesagt wird, dass assignable, default_constructible und equal_compareable ausreicht, an anderer Stelle wird aber nebenbei erwähnt, dass vertex_descriptor ein Integertyp sein muss. Tatsächlich findet man, wenn sich durch das Templategewirr wühlt, für die adjacency_list (und vermutlich auch für die anderen Typen, aber dies alleine nachzusehen hat schon lange gedauert) eine fest vorgegebene Definition von vertex_descriptor als entweder std::size_t oder void* (je nach unterliegendem Container).
Was du aber machen kannst, ist, deinen Vertizes einen string als Propertiy zu verpassen. Das sollte so wie dokumentiert funktionieren.
Eisflamme schrieb:
Ist halt schade, dass Du add_edge nicht in Deinem Code aufgeführt hast. Oder von welcher Deiner Zeilen wird der Fehler ausgelöst?
Das add_edge ist eine Memberfunktion der Graphen in Boost Graph, die unter anderem vom gezeigten Konstruktor benutzt wird.
-
Danke fuer den Hinweis! Wenn in dem Graphen ein property vom Typ string hinzufuege muss ich aber doch trotzem die Edegs als Integer uebergeben?
-
Helmut Kohl schrieb:
Danke fuer den Hinweis! Wenn in dem Graphen ein property vom Typ string hinzufuege muss ich aber doch trotzem die Edegs als Integer uebergeben?
Wenn ich mich recht erinnere: Ja. Falls du dir irgendwie Sorgen machst, wie du das zusammen bekommen sollst: Ein paar Möglichkeiten die mir gerade durch den Kopf gehen:
- Dreistellige Zeichenketten kann man leicht eindeutig als Zahl auffassen
- Oder std::hash benutzen
- Falls die Übersetzung string<->integer teuer wird, kann man sich eine map als Lookuptabelle von schon ausgerechneten Werten machen.