私はおそらくBGLについて少しガイダンスを提供することができます。
ライブラリは非常に柔軟です。これの代償は、すべての可能性に対応するために、構文が非常にバロックになる可能性があることです。ただし、簡単なことを簡単に実行できるほど十分な柔軟性があります。
残念ながら、ブーストのドキュメントは完全に傾いており、完全な複雑さの説明のみを提供し、物事がいかに単純であるかについてのヒントはありません。
(「十分に高度な技術は魔法と見分けがつかない」-アーサーC.クラーク。彼が言うべきことは、「十分に文書化されていない高度な技術は魔法と見分けがつかない」ということです。
検討:
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] << " ";
}
これは、「クイックツアー」がグラフの頂点のリストを印刷することを提案する方法です。ただし、少し調べてみると、頂点は整数インデックスにすぎず、コードは次のように大幅に簡略化できます。
for (int v = *vertices(g).first; v != *vertices(g).second; ++v)
std::cout << v << " ";
おそらく、この単純化されたコードでは達成できない魔法のようなことがいくつかありますが、毎日、BGLを覆う構文を大幅に整理して、コーディング内容を確認できるようにするのが妥当です。
複雑な構文を削除できない場合があります。(または、おそらく私は根本的な真実に気づいていません)。次に、私は通常、小さなユーティリティ関数を使用して複雑さをカプセル化し、作業中のアルゴリズムから遠ざけます。
たとえば、頂点の子をループする必要があることがよくあります
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 )
要点は次のとおりです。先に進み、BGLを使用します。簡単なことをするために単純化することができますが、それを使用することを学んだら、あなたがそれを必要とするときはいつでもすべての計り知れない柔軟性が利用可能になります。