C++提升图:如何通过迭代add_vertex
C++ boost graph : how to add_vertex via iteration
我有一个大的.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++初学者。
一些建议:
- 使用矢量存储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);
这是你想要的吗?
- 使用地图或无序列图进行上面的转换
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>
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 迭代时从向量和内存中删除对象
- 如何在c++迭代器类型中包装std::chrono
- 带过滤器的现代迭代c++集合
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- C++矢量迭代
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 擦除while循环中迭代的元素
- 实现一个在集合上迭代的模板函数
- 对于set上的循环-获取next元素迭代器
- 在向量内的向量上迭代
- 为什么output_editor Concept不需要output_e迭代器标记
- TSP递归解的迭代形式
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 使用迭代器时如何访问对象在向量中的位置?
- std::vector::迭代器是否可以合法地作为指针
- 跟随整数索引列表的自定义类迭代器