【问题标题】:Serializing vertex_descriptor of a boost::graph separately?分别序列化 boost::graph 的 vertex_descriptor?
【发布时间】:2012-11-24 01:43:04
【问题描述】:

有什么方法可以使vertex_descriptorboost::graph 可序列化? Boost 确实定义了<boost/graph/adj_list_serialize.hpp> 用于序列化整个图结构,但不是单独定义。

我有一个包含 3dvector(顺便表示 X、Y、Z 坐标中的 3d 世界)顶点的邻接列表图

typedef boost::adjacency_list<
        boost::listS,
        boost::listS,
        boost::undirectedS,
        3dvector>
    Graph;

typedef Graph::vertex_descriptor VertexId;
typedef Graph::edge_descriptor EdgeId;

但是我还需要保留一个单独的映射信息以供查找,这就是问题所在:boost 不知道如何序列化VertexId。它们存储在 STL 映射中,如下所示:std::map&lt;string, VertexId&gt; 以便字符串查找可以返回图中的正确顶点,因为 vertex_descriptor 本质上是指向图中特定顶点的引用。

我的意图是将图形和地图都序列化到一个文件中,但我找不到序列化 vertex_descriptor 的方法。

【问题讨论】:

    标签: serialization boost graph stl map


    【解决方案1】:

    您将需要存储图形和位置(一些向量/顶点列表)。您必须为代表您的顶点的任何内容编写序列化方法。

    template<typename Archive>
    void serialize(Archive &ar, LatLon &loc, const unsigned int /*version*/) {
        ar &loc.latitude &loc.longitude;
    }
    

    现在您可以使用以下方法序列化您的图表:

    std::vector<LatLon> locations; // or a list
    archive & graph & locations;
    

    graph 是 adjencency_list,locations 是 LatLon 类/结构的向量/列表。我认为 boost 已经知道如何处理列表/向量。

    【讨论】:

    • 我自己存储数据没问题,存储STL也没问题。问题是如何序列化 boost::graph_traits::vertex_descriptor (这是映射中键/值对中的值)。不清楚我应该怎么做,它似乎没有暴露任何内部成员,所以我觉得它应该用作不透明的数据类型
    • 你用什么做vertex_descriptor?不是已经和图一起序列化了吗?
    • 我使用boost::listS 作为我的顶点类型。这是你问的吗?是的,它存储在图表中,但我还保留了一个单独的map&lt;string, vertex_descriptor&gt;,我也想对其进行序列化。这就是问题所在:boost 知道如何序列化std::mapstd::string,但不知道boost::vertex_descriptor 提示:我在上面将vertex_descriptor 键入为VertexId,以防有人没有注意到
    • 当您使用列表时,vertext_descriptor 是一个列表迭代器。也许尝试改用 VecS(这通常也更快),然后它是一个整数。
    • 这是可能的,但这需要对我的算法进行大量更改,因为我不准备处理必须修复大量迭代器的问题,因为我在图中进行了大量添加/删除操作。遗憾的是我们不能序列化迭代器(这可能是由于实现它所涉及的复杂性)。我决定在必要时重建映射,因为这对我来说是一个更现实的选择。
    猜你喜欢
    • 1970-01-01
    • 2015-04-28
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    相关资源
    最近更新 更多