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?


  • Mod

    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?


  • Mod

    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.


Anmelden zum Antworten