4

私は債券グラフを操作するためのライブラリを作成しており、Boost Graph Library を使用してデータを保存しています。残念ながら、頂点をサブクラス化できないため、それを使用して適切なビジター パターンを実装する方法を理解できないようです。代わりに「プロパティ」に依存する必要があります。ライブラリで提供されているビジター フレームワークは、頂点がすべて同じタイプであるが、異なる情報を格納する特定のアルゴリズムを操作することに重点を置いているようです。私の問題では、頂点はさまざまなタイプであり、さまざまなタイプの情報を格納しています.いくつかの頂点は抵抗器であり、いくつかの頂点はコンデンサなどです。頂点そのもの?

これまでの私の唯一の考えは、グラフ情報を取得するために必要な元の頂点を指すオブジェクトの型を表す小さなクラスを作成することでした。ただし、これは非常に厄介で、操作するのが悪いようです。

4

3 に答える 3

6

頂点をサブクラス化できないとはどういう意味ですか? 独自の頂点クラスを使用できます。グラフの typedef で指定するだけです。BGL アルゴリズムを使用する場合は、メンバーをプロパティとして使用することもできます。

逆に (IMO の方が難しい)、頂点プロパティ リストを作成し、頂点記述子を使用してアクセスする必要があります。

編集:グラフタイプを定義するときに頂点/エッジクラスを指定します:

struct Vertex {
    double some_property;
};

struct Edge {
    double weight;
};

typedef boost::adjacency_list<
    boost::listS, boost::vecS, boost::undirectedS, Vertex, Edge
> Graph; //sorry about the formatting

Graph g;

どこから g[vertex_descriptor] が Vertex への参照を返すべきか、例えば:

//add 100 vertices
for (int i=0; i<100; ++i) {
    Graph::vertex_descriptor v = add_vertex(g);
    g[v].some_property = -1.0;
}

//zero some_property for all vertices
for (Graph::vertex_iterator i = vertices(g).first;
                            i != vertices(g).second;
                            ++i)
{
    g[*i].some_property = 0.0;
}

これらのプロパティを使用しているビジター コードは見つかりませんでしたが、BGL ドキュメントの関連部分は見つかりました。

1)代わりに使用することを推奨するInternal Properties
に関する部分: 2) Bundled Properties

2番目のリンクには、メンバーポインターを使用してバンドルされたプロパティを利用する Boost 関数があるようです。

これは役に立ちますか?

于 2009-07-14T14:24:52.780 に答える
4

気になる人がいるとすれば、2 か月後、この物件を見ている訪問者がいます。

class demo_visitor : public default_bfs_visitor {
public:
    template <typename Vertex, typename Graph>
    void discover_vertex( Vertex u, Graph& g)
    {
        printf("Visited vertex %d with property %f\n",
            u, g[u].some_property);
    }
};

訪問者がプロパティを変更する必要がある場合、状況は少し複雑になります。問題について -ここをクリック

于 2009-10-02T19:30:36.390 に答える
0

たぶん、boost :: Variantを使用して頂点タイプの互いに素な合計を作成し、BGLビジターを各頂点でboost :: Variantビジターと組み合わせることができますか?

于 2009-07-14T08:08:26.440 に答える