2

いくつかのフィールドを含む2つの構造体があります:structMyNodeDataとstructMyEdgeDataです。VertexListをvecSとしてグラフを作成する場合、頂点などの記述子にアクセスするのに問題はありません。次に例を示します。

typedef adjacency_list<setS, vecS, undirectedS, MyNodeData, MyEdgeData> Graph;

typedef Graph::vertex_descriptor MyNodeDataID;
typedef Graph::edge_descriptor MyEdgeDataID;
typedef graph_traits < Graph >::vertex_iterator VertexIterator;
typedef graph_traits < Graph >::edge_iterator EdgeIterator;
typedef graph_traits < Graph >::adjacency_iterator AdjacencyIterator;
typedef property_map < Graph, vertex_index_t >::type IndexMap;

Graph g;
const IndexMap index = get(vertex_index, g);

/* Puis après avoir ajouté des vertex et edges, je peux accéder par exemple à la liste des vertex comme suite: */
pair<VertexIterator, VertexIterator> vi;
for(vi = vertices(g); vi.first != vi.second; ++vi.first)
{
   cout << "vertex: " << index[*vi.first] << endl;
   // or: cout << "vertex: " << *vi.first << endl;
}

しかし、私は通常、グラフからエッジと頂点を追加/削除する必要があります。したがって、vecSでは、vecSの代わりにsetSまたはlistSをVertexListとして使用したいと思います。これは、vecSでは、インデックスの1つを削除すると、インデックスが無効になるためです。問題は、VertexListをsetSまたはlistSとして定義すると、以前のように頂点/エッジのリストを参照してそこの記述子にアクセスできないことです。

簡単に言うと、私の質問は次のとおりです。頂点コンテナとしてlistSまたはsetSを使用するadjacency_listは、このvertex_idプロパティを自動的に提供しないので、上記のコードに追加するにはどうすればよいですか?

4

2 に答える 2

0

現在、関連付けられたプロパティマップを提供する必要があります。

<...>
typedef Graph::vertex_descriptor NodeID;

typedef map<NodeID, size_t> IndexMap;
IndexMap mapIndex;
associative_property_map<IndexMap> propmapIndex(mapIndex);
<...>

// indexing all vertices
int i=0;
BGL_FORALL_VERTICES(v, g, Graph)
{
   put(propmapIndex, v, i++);
}
于 2011-12-18T23:57:16.617 に答える
0

しかし、私は通常、グラフからエッジと頂点を追加/削除する必要があります。

頂点とエッジの削除は、vecS、setS listSで可能です。頂点\エッジ記述子を使用してremove_vertex\remove_edgeを呼び出すだけです。上記のすべてのコンテナで、\を削除して頂点\エッジを追加すると、イテレータが無効になります。これは、グラフを変更した後、vertices(g)を再度呼び出す必要があることを意味します。ほとんどのコンテナでは、コンテナを変更するとイテレータが無効になります。listSでは、頂点を追加してもイテレータが無効になることはありませんが、これは実装固有であり、信頼するべきではありません。

グラフにvertex_idプロパティを追加して、いつでも頂点記述子にアクセスできるようにすることができます。

于 2017-05-18T00:35:46.897 に答える