33

頂点参照自体の代わりにキーを使用して頂点プロパティにアクセスする方法を探しています。たとえば、私が持っている場合

class Data
{
  public:
    std::string  name;
    unsigned int value; 
}; 
typedef boost::adjacency_list< boost::vecS, boost::vecS, boost::directedS, Data > Graph;
typedef boost::graph_traits<Graph>::vertex_descriptor Vertex;

使用する代わりに

Vertex vertex1 = boost::add_vertex( g );
g[vertex1].name  = "Alpha";
g[vertex1].value = 10;

私はを頂きたい

g["Alpha"].name  = "Alpha";
g["Alpha"].value = 10;

すぐに使用できるメカニズムは存在しますか?

4

2 に答える 2

34

私はそのようなメカニズムを見つけたと思います。これはlabeled_graphと呼ばれ、BGLの一部です。adjacency_listを使用する代わりに、事前定義されたラッパーlabeled_graphを使用できます。

typedef boost::labeled_graph<
    boost::adjacency_list< boost::vecS, boost::vecS, boost::directedS, Data >,
    std::string
> Graph;

このようなグラフを定義すると、次の方法で頂点にアクセスできます。

Graph g;

boost::add_vertex( "Alpha", g );
g["Alpha"].name  = "Alpha";
g["Alpha"].value = 10;

boost::add_vertex( "Beta", g );
g["Beta"].name  = "Beta";
g["Beta"].value = 20;

boost::add_edge_by_label( "Alpha", "Beta", g );

これの副作用は、いくつかのアルゴリズムを機能させるためにgraph()メンバー関数を使用する必要があることです。

std::vector< Graph::vertex_descriptor > container;
boost::topological_sort( g.graph(), std::back_inserter( container ) ) ;

何らかの理由で、labeled_graphはBGLドキュメントに記述されていませんが、サンプルフォルダーに表示されます。

返信ありがとうございます、セルジュ

于 2010-02-11T22:05:18.223 に答える
1

構造体のフィールドによって頂点プロパティにアクセスしたいadjacency_listという概念を認識できないため、すぐに使用できるメカニズムは存在しません。

データの名前を対応する頂点にマップする追加のマップを作成する方法をお勧めします。さらに、アルゴリズムをクラスまたは関数にカプセル化して、新しい頂点を追加するときにマップが自動的に塗りつぶされるようにすることができます。

于 2010-02-11T13:43:13.713 に答える