我将把一个国际象棋游戏表示为C++结构。我认为,最好的选择是树形结构(因为在每个深度我们都有几个可能的移动)。
这是一个好的方法吗?
struct TreeElement{
SomeMoveType move;
TreeElement *parent;
std::vector<TreeElement*> children;
};如何高效地将这类数据存储在文件中?有没有办法确保整个树形结构都存储在内存的同一部分,这样就可以使用mmap函数了?
发布于 2012-02-19 23:29:14
要将数据存储在内存的同一部分,您可能希望为您使用的std::vector<TreeElement *>提供一个分配器对象,并从您的块中分配该数据。
为了能够序列化它,而不是存储实际的指针,您可以考虑在块中存储偏移量。然后,当您读回数据时,您可以将块的起始地址添加到每个偏移量中,以将其转换回地址。
根据您正在使用的操作系统/编译器,可能已经对此提供了一些支持。例如,微软的编译器支持__based指针,这几乎就是我所描述的:一个基地址,每个基于该地址的指针实际上只是一个偏移量,而不是一个完整的指针。提到mmap表明您可能不能直接使用它,但是您使用的编译器/OS可能有类似的东西。否则,您可能不得不自己完成这项工作(例如,使用based_pointer类)。
真正的问题是你为什么要尝试序列化一个移动树。在典型的情况下,你最好保存当前的棋盘位置(或者,相当于,移动历史记录),并在需要的时候重新生成移动树。这足够小了,所以很容易存储。
发布于 2012-02-24 15:00:52
我认为使用std::vector不是创建树的最佳方式,单链表样式的树构造可能更简单、更好。
https://stackoverflow.com/questions/9350417
复制相似问题