带自定义属性的Boost图深拷贝实现问题及性能咨询
Boost图自定义属性深拷贝问题及解决
问题背景
我有一个带自定义属性的Boost图,尝试深拷贝时出现大量编译错误,相关代码如下:
图类型定义
using BGType = boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS, // 顶点属性 vertexProps, // 边属性 edgeProps, // 图属性 graphProps>;
顶点属性定义(vertexProps.h)
class vertexProps { public: explicit vertexProps(const std::string *moduleName = nullptr, const std::string *name = nullptr, long refPtr = 0 ) : _refPtr(refPtr) { _moduleName = moduleName ? *moduleName : ""; _name = name ? *name : ""; }; struct CustomVertexCopy { void operator()(const vertexProps& source_vertex, vertexProps& target_vertex) const { target_vertex._refPtr = source_vertex._refPtr; target_vertex._moduleName = source_vertex._moduleName; target_vertex._name = source_vertex._name; } };
边属性定义(edgeProps.h)
class edgeProps { public: explicit edgeProps(std::string name = "") : _name(name){}; std::string _name; }; struct CustomEdgeCopy { void operator()(const edgeProps& source_edge, edgeProps& target_edge) const { target_edge._name = source_edge._name; } };
拷贝代码(someFunction.cpp)
OnClick(BGType* bGraph) { // 其他代码 BGType* oldBg = new BGType; boost::copy_graph(bGraph, oldBg, boost::vertex_copy(CustomVertexCopy())); boost::copy_graph(bGraph, oldBg, boost::edge_copy(CustomEdgeCopy())); // 其他代码 }
疑问
- 上述代码哪里出错了?
- 如果图规模较大,这种深拷贝会影响性能吗?有没有优化方法?
后续修改及问题
修改后的无编译错误代码
我按建议调整后仍有编译错误,于是修改成以下代码,现在编译正常,请判断是否正确:
OnClick(BGType* bGraph) { // 其他代码 BGType* oldBg = new BGType; boost::copy_graph(*bGraph, *oldBg, boost::vertex_copy(CustomVertexCopy{*bGraph,*oldBg}) .edge_copy(CustomEdgeCopy{*bGraph, *oldBg})); // 其他代码 }
图属性拷贝问题
我的图还包含自定义图属性,定义如下,请问如何同时拷贝图属性?
class graphProps { public: explicit graphProps(std::string *name = nullptr) { _name = name ? *name : ""; }; std::string _name; std::map<std::string, std::tuple<std::vector<schPinInfo *>, // 输入引脚 std::vector<schPinInfo *>, // 双向引脚 std::vector<schPinInfo *>> // 输出引脚 > _modInfo; std::map<std::string, std::vector<std::string>> _altNames; std::map<std::string, schSymbol> _modSymbol; };
问题解答
1. 初始代码错误分析
- 参数类型错误:
boost::copy_graph要求传入图对象而非指针,你传入的BGType*类型参数不符合要求,应该使用解引用后的*bGraph和*oldBg。 - 重复调用拷贝函数:两次调用
copy_graph会导致目标图被重复初始化,第二次调用会覆盖第一次的结果,不符合深拷贝逻辑,应该一次性完成顶点和边的拷贝。 - 拷贝器构造冗余:你的
CustomVertexCopy和CustomEdgeCopy拷贝逻辑仅操作属性,不需要依赖图对象,因此传入图对象初始化拷贝器是多余的,甚至会因为缺少对应构造函数导致编译错误。
2. 修改后代码的正确性判断
修改后的代码解决了参数类型问题,并且合并了顶点和边拷贝到一次copy_graph调用中,这部分是正确的。但拷贝器的初始化可以简化,因为当前拷贝逻辑不需要图对象:
boost::copy_graph(*bGraph, *oldBg, boost::vertex_copy(CustomVertexCopy()) .edge_copy(CustomEdgeCopy()));
3. 图属性的拷贝方法
boost::copy_graph默认不会自动拷贝图属性,需要手动处理:
- 直接赋值法:在调用
copy_graph后,手动拷贝图属性:
注意:如果oldBg->graph_property() = bGraph->graph_property();graphProps中的schPinInfo*需要深拷贝(即复制指针指向的对象而非仅拷贝指针地址),需要手动实现graphProps的拷贝构造函数和赋值运算符,对_modInfo中的指针逐一创建新对象。如果只是共享指针指向的对象,默认赋值即可。
4. 大规模图的性能问题及优化
- 性能影响:深拷贝会带来线性增长的时间和内存开销,大规模图的拷贝会明显影响性能。
- 优化方法:
- 避免不必要拷贝:如果不需要完整复制图,可以使用Boost提供的图视图(如子图
boost::subgraph)或自定义包装类,直接引用原数据而非拷贝。 - 浅拷贝替代:若属性中的对象是只读或可共享的,可采用浅拷贝减少开销,但需注意管理对象生命周期,避免悬空指针。
- 分批拷贝:业务允许的情况下,分批次拷贝部分图数据,降低单次操作的性能压力。
- 优化容器:将图属性中的
std::map替换为哈希映射(如boost::unordered_map),提升拷贝和访问效率。
- 避免不必要拷贝:如果不需要完整复制图,可以使用Boost提供的图视图(如子图
内容的提问来源于stack exchange,提问作者tushar
相关产品推荐
相关产品推荐

