Ich kann vielleicht ein wenig Anleitung für die BGL bieten.
Die Bibliothek ist sehr flexibel. Der Preis dafür ist, dass die Syntax sehr barock sein kann, um alle Möglichkeiten unterzubringen. Es ist jedoch ausreichend flexibel, dass einfache Dinge einfach erledigt werden können.
Leider geht die Boost-Dokumentation in Sachen Vollgas und bietet nur eine Beschreibung der ganzen Komplexität, ohne einen Hinweis darauf, wie einfach Dinge sein können.
(. „Jede hinreichend fortschrittliche Technologie von Magie nicht zu unterscheiden ist“ - Arthur C. Clarke Was er gesagt haben sollte „Jede hinreichend fortschrittliche Technologie ist schlecht dokumentiert, nicht von Magie)
Bedenken Sie:
typedef property_map<Graph, vertex_index_t>::type IndexMap;
IndexMap index = get(vertex_index, g);
typedef graph_traits<Graph>::vertex_iterator vertex_iter;
std::pair<vertex_iter, vertex_iter> vp;
for (vp = vertices(g); vp.first != vp.second; ++vp.first) {
std::cout << index[*vp.first] << " ";
}
Dies ist, wie die „Quick-Tour“, schlägt wir eine Liste der Eckpunkte Diagramm ausdrucken. Allerdings ein wenig Studie zeigt, dass ein Scheitelpunkt als ein integer-Index nicht mehr ist, und der Code kann stark zu
vereinfacht werden
for (int v = *vertices(g).first; v != *vertices(g).second; ++v)
std::cout << v << " ";
Vielleicht gibt es einige magische Dinge, die mit diesem vereinfachten Code nicht erreicht werden können, aber für jeden Tag ist es sinnvoll, die Syntax, die BGL inkrustiert, drastisch zu beschneiden, damit Sie sehen können, was Sie codieren.
Manchmal kann die ausgefeilte Syntax nicht entfernt werden. (Oder vielleicht habe ich gerade die zugrunde liegende Wahrheit nicht bemerkt). Dann benutze ich normalerweise eine kleine Hilfsfunktion, um die Komplexität zu kapseln und sie von dem Algorithmus, an dem ich arbeite, fernzuhalten.
Zum Beispiel, ich muss oft eine Schleife über die Kinder eines Scheitels
vector<int> getVertexChildren(int v)
{
vector<int> vc;
typedef std::pair<graph_traits<graph_t>::out_edge_iterator, graph_traits<graph_t>::out_edge_iterator> out_edge_iter_pair_t;
for(out_edge_iter_pair_t ep = out_edges(v,m_tree);
ep.first != ep.second; ++(ep.first))
{
vc.push_back(target(*ep.first, m_tree));
}
return vc;
}
#define FOR_ALL_CHILDREN(v) vector<int> vc=getVertexChildren(v); BOOST_FOR_EACH(int child, vc)
Unterm Strich ist: gehen Sie voran und BGL verwenden. Es kann vereinfacht werden, einfache Dinge zu tun, aber sobald Sie gelernt haben, es zu verwenden, wird die ganze immense Flexibilität verfügbar sein, wann immer Sie es brauchen.
Boost für seine Qualität allgemein bekannt, und die BGL-Schnittstellen mit GraphViz. – Clifford
@Clifford hat Recht - unterschätzen Sie nicht die Fähigkeit, GraphViz zu nutzen - es ist absolut erstaunlich. – DaveParillo