其他分享
首页 > 其他分享> > c-VertexList与vecS不同的adjacency_list

c-VertexList与vecS不同的adjacency_list

作者:互联网

我有两个包含某些字段的结构:struct MyNodeData和struct MyEdgeData.当我创建一个以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;
}

但是我通常需要从图中添加/删除边和顶点.所以我想将setS或listS用作VertexList而不是vecS,因为使用vecS时,当我们删除其中之一时索引无效!
问题是,如果我将VertexList定义为setS或listS,则无法浏览顶点/边的列表并无法像以前一样访问那里的描述符!

简而言之,我的问题是:由于使用listS或setS作为顶点容器的adjacency_list不会自动提供此vertex_id属性,因此如何将其添加到上面的代码中?

解决方法:

当前,您只需要提供一个关联的属性图.

<...>
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++);
}

标签:adjacency-list,c,boost,graph,boost-graph
来源: https://codeday.me/bug/20191012/1897075.html