C++提升图:如何通过迭代add_vertex

C++ boost graph : how to add_vertex via iteration

本文关键字:迭代 add vertex 何通过 C++      更新时间:2023-10-16

我有一个大的.json文件,其中的顶点信息被解析并大量使用指针分配到内存中。为了简化起见,假设我有一个顶点标签向量,例如:

vector<string> vertices = {'A', 'B', 'C'}; //assume it is much longer

如何通过迭代 AND 将此向量作为我的提升图的顶点传入,而无需为每个顶点创建唯一的vector_descriptor?

我想避免的:

using namespace boost;
struct Vertex {string label};
struct Edge {double weight};
typedef adjacency_list<vecS, vecS, bidirectionalS, Vertex, Edge> Graph;
typedef graph_traits < Graph >::vertex_descriptor vertex_t;
typedef graph_traits < Graph >::edge_descriptor edge_t;
Graph g;
// manual generation of each vertex
vertex_t a = add_vertex(g); g[a].label = 'A'; 
vertex_t b = add_vertex(g); g[b].label = 'B'; 
vertex_t c = add_vertex(g); g[c].label = 'C'; 
add_edge(a,b,g); // reference to vertices by vertex_descriptor
add_edge(a,c,g);

我想要什么:

using namespace boost;
typedef adjacency_list<vecS, vecS, bidirectionalS, Vertex, Edge> Graph;
Graph g;
vector<string> vertices = {'A', 'B', 'C'}; //assume it is much longer
for (i=0; i<vertices.size(); i++) { // iterating thru 'long' vector
    add_vertex(vertices.at(i), g); // no unique vertex descriptor per vertex
}
add_edge('A', 'B', g); // reference to vertex label
add_edge('A', 'C', g);

我尝试过的:但是我对这种方法的麻烦是将向量转换为枚举类型。或者找到一种方法来附加到枚举类型,以对应于我想要的迭代,因为我的顶点很大 #。

using namespace boost;
typedef adjacency_list<vecS, vecS, bidirectionalS, Vertex, Edge> Graph;
Graph g;
enum {A, B, C};
add_edge(A, B, g); // reference to vertex label
add_edge(A, C, g);

注意:我希望提供建议和解释以适应您的解决方案。我是一个C++初学者。

一些建议:

  1. 使用矢量存储vertex_t
vector<string> vertices = {"A", "B", "C"}; //assume it is much longer
vector<vertex_t> vtx;
for (i=0; i<vertices.size(); i++) { // iterating thru 'long' vector
    vertex_t tmp = add_vertex(g);
    g[tmp].label = vertices.at(i);
    vtx.push_back(tmp); // no unique vertex descriptor per vertex
}
add_edge(vtx[0], vtx[1], g); // reference to vertices by vertex_descriptor
add_edge(vtx[0], vtx[2], g);

这是你想要的吗?

  1. 使用地图或无序列图进行上面的转换
vector<string> vertices = {"A", "B", "C"}; //assume it is much longer
unordered_map<string, vertex_t> vtx;
for (i=0; i<vertices.size(); i++) { // iterating thru 'long' vector
    vertex_t tmp = add_vertex(g);
    g[tmp].label = vertices.at(i);
    vtx.emplace(vertices.at(i), tmp); // no unique vertex descriptor per vertex
}
add_edge(vtx["A"], vtx["B"], g); // reference to vertices by vertex_descriptor
add_edge(vtx["A"], vtx["C"], g);

这是你想要的吗?

要使用unordered_map,您需要#include <unordered_map>