You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何复制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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 11:05:13