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

带自定义属性的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()));
  // 其他代码
}

疑问

  1. 上述代码哪里出错了?
  2. 如果图规模较大,这种深拷贝会影响性能吗?有没有优化方法?

后续修改及问题

修改后的无编译错误代码

我按建议调整后仍有编译错误,于是修改成以下代码,现在编译正常,请判断是否正确:

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),提升拷贝和访问效率。

内容的提问来源于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 10:15:20