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()实现到磁盘,它应该相当快,但明显的问题是:
我不提前知道尺寸;
数据包含迭代器,它们是易失性的;
我对C++的无知是惊人的.
请问有人建议使用纯C++解决方案吗?
似乎您可以使用以下语法保存数据:
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,您就可以丢弃该向量。
归档时间: |
|
查看次数: |
2609 次 |
最近记录: |