"我想做的事"
- 读取一个graphml文件,其中包含文件中存在的所有节点和边属性(类型和计数任意)
- 对图形进行操作
- 添加其他属性
- 再次将Graph写入graphml文件
"我所拥有的"
不多,但从我从其他帖子和boost文档中收集到的信息:
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graphml.hpp>
#include <fstream>
int main(int argc, char const *argv[]) {
auto filename = argv[1];
std::ifstream input_stream;
input_stream.open(filename, std::ifstream::in);
boost::adjacency_list<boost::setS, boost::setS> graph;
boost::dynamic_properties props;
boost::read_graphml(input_stream, graph, props);
input_stream.close();
// do stuff with the graph
// write it out to a file again
return 0;
}
"怎么了"
上面的代码退出时出现property_not_found
错误,原因是创建dynamic_properties
时没有使用generator_fn
,以便在文件中遇到以前未知的属性时动态创建属性Map(据我所知,请参阅dynamic_property_map.hpp
中的免费put
函数)。
- 问题**
我如何创建一个boost::dynamic_properties
对象,它知道如何为graphml文件中的顶点/边属性创建一个动态Map?也许我甚至不理解boost::dynamic_properties
的正确用法,如果是这样,请给我指出正确的方向。
1条答案
按热度按时间nuypyhwy1#
注意,最简单的方法是使用内置的
ignore_other_properties
:给定的输入xml为
图纸
警告!
有几点要注意。
1.您的图模型没有为任何属性配备存储器,所以我假设您希望它们是外部的。
1.你的图模型假定了方向性,并且禁止重复的边。这可能不是你所需要的。
1.如果没有外部
vertex_index
属性,您的图模型甚至无法编写,因为您选择的基于节点的顶点容器(setS
)没有隐式属性。你会怎么做?
由于上面列出的缺点,我将放弃固执己见的
setS
选择。注意,我们仍然假设方向性。我将把它留给您"修复"。从我现有的答案中搜索显示了如何将dynamic_properties与动态Map一起使用。
现在按预期保留
Name
属性:更新:强类型?
作为对注解的响应,我添加了一个强类型Map器。
它非常优雅,因为我"翻转"了存储,使得整个变量访问变得不必要(除了存储)。生成的数据结构在您自己的代码中使用要困难得多,这种优雅有点谎言,请注意。
向边添加
double
属性时:使用以下数据
现在打印输出:
表明属性不再是字符串。