如何复制Boost图的图属性?已完成顶点与边属性复制
解决Boost图复制时图属性无法复制的问题
Boost的copy_graph函数仅负责复制图的顶点、边结构,以及通过自定义复制器处理顶点/边属性,不会自动复制图级别的属性,需要手动处理。
直接解决方案:手动复制图属性
在copy_graph执行完成后,利用Boost提供的get_property函数获取源图和目标图的图属性对象,直接完成赋值操作(你的graphProps类成员均为可拷贝的标准容器,默认拷贝赋值运算符可正常工作)。
修改后的调用代码如下:
OnClick(BGType* bGraph) { // some code BGType* oldBg = new BGType; boost::copy_graph(*bGraph, *oldBg, boost::vertex_copy(CustomVertexCopy{*bGraph,*oldBg}) .edge_copy(CustomEdgeCopy{*bGraph, *oldBg})); // 新增:复制图属性 boost::get_property(*oldBg) = boost::get_property(*bGraph); // some code }
注意事项:指针成员的浅拷贝问题
你的graphProps类中包含schPinInfo*类型的指针,默认的拷贝操作是浅拷贝——仅复制指针地址,不会复制指针指向的实际对象。如果需要深拷贝这些指针指向的内容,必须手动为graphProps实现拷贝构造函数、拷贝赋值运算符和析构函数:
class graphProps { public: explicit graphProps(std::string *name = nullptr) { _name = name ? *name : ""; }; // 深拷贝构造函数 graphProps(const graphProps& other) { _name = other._name; // 深拷贝_modInfo中的所有schPinInfo指针 for (const auto& pair : other._modInfo) { auto& src_tuple = pair.second; std::vector<schPinInfo*> in_pins, inout_pins, out_pins; // 复制输入引脚 for (schPinInfo* pin : std::get<0>(src_tuple)) { in_pins.push_back(new schPinInfo(*pin)); // 假设schPinInfo支持拷贝构造 } // 复制双向引脚 for (schPinInfo* pin : std::get<1>(src_tuple)) { inout_pins.push_back(new schPinInfo(*pin)); } // 复制输出引脚 for (schPinInfo* pin : std::get<2>(src_tuple)) { out_pins.push_back(new schPinInfo(*pin)); } _modInfo[pair.first] = std::make_tuple(in_pins, inout_pins, out_pins); } // 标准容器直接拷贝 _altNames = other._altNames; _modSymbol = other._modSymbol; } // 深拷贝赋值运算符 graphProps& operator=(const graphProps& other) { if (this == &other) return *this; // 先释放当前对象的指针资源 for (auto& pair : _modInfo) { auto& tuple = pair.second; for (schPinInfo* pin : std::get<0>(tuple)) delete pin; for (schPinInfo* pin : std::get<1>(tuple)) delete pin; for (schPinInfo* pin : std::get<2>(tuple)) delete pin; } _modInfo.clear(); // 执行深拷贝 _name = other._name; for (const auto& pair : other._modInfo) { auto& src_tuple = pair.second; std::vector<schPinInfo*> in_pins, inout_pins, out_pins; for (schPinInfo* pin : std::get<0>(src_tuple)) { in_pins.push_back(new schPinInfo(*pin)); } for (schPinInfo* pin : std::get<1>(src_tuple)) { inout_pins.push_back(new schPinInfo(*pin)); } for (schPinInfo* pin : std::get<2>(src_tuple)) { out_pins.push_back(new schPinInfo(*pin)); } _modInfo[pair.first] = std::make_tuple(in_pins, inout_pins, out_pins); } _altNames = other._altNames; _modSymbol = other._modSymbol; return *this; } // 析构函数:释放指针资源 ~graphProps() { for (auto& pair : _modInfo) { auto& tuple = pair.second; for (schPinInfo* pin : std::get<0>(tuple)) delete pin; for (schPinInfo* pin : std::get<1>(tuple)) delete pin; for (schPinInfo* pin : std::get<2>(tuple)) delete pin; } } 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; };
内容的提问来源于stack exchange,提问作者tushar
相关产品推荐
相关产品推荐

