如何将C++类实例(使用STL容器)加载/保存到磁盘

ati*_*ati 6 c++ io serialization stl multiway-tree

我有一个C++类,表示一个非常大的分层组织数据树(~Gb,基本上和我在内存中可以消除的一样大).它使用STL列表在每个节点上存储信息,并在其他节点上存储迭代器.每个节点只有一个父节点,但有0-10个子节点.抽象,它看起来像:

struct node {
public:
    node_list_iterator parent;              // iterator to a single parent node
    double node_data_array[X];
    map<int,node_list_iterator> children;   // iterators to child nodes
};

class strategy {
private:
    list<node> tree;        // hierarchically linked list of nodes
    struct some_other_data;
public:
    void build();           // build the tree
    void save();            // save the tree from disk
    void load();            // load the tree from disk
    void use();             // use the tree
};
Run Code Online (Sandbox Code Playgroud)

我想将load()和save()实现到磁盘,它应该相当快,但明显的问题是:

  1. 我不提前知道尺寸;

  2. 数据包含迭代器,它们是易失性的;

  3. 我对C++的无知是惊人的.

请问有人建议使用纯C++解决方案吗?

MSa*_*ers 1

似乎您可以使用以下语法保存数据:

File = Meta-data Node
Node = Node-data ChildCount NodeList
NodeList = sequence (int, Node)
Run Code Online (Sandbox Code Playgroud)

也就是说,当序列化时,根节点包含所有节点,无论是直接节点(子节点)还是间接节点(其他后代节点)。编写格式相当简单:只需从根节点开始递归写入函数即可。

读书并没有那么难。std::list<node>迭代器是稳定的。一旦插入根节点,其迭代器就不会改变,即使插入其子节点时也是如此。因此,当您读取每个节点时,您已经可以设置父迭代器。当然,这会给您留下子迭代器,但这些都是微不足道的:每个节点都是其父节点的子节点。因此,在读取所有节点后,您将修复子迭代器。从第二个节点、第一个子节点(第一个节点是根节点)开始,迭代到最后一个子节点。然后,对于每个子 C,将其父级和子级获取到其父级的集合。现在,这意味着您必须int在阅读时将子 ID 设置在一边,但您可以在与std::list<node>. 一旦您修补了相应父项中的所有子 ID,您就可以丢弃该向量。