我将代表国际象棋游戏作为C ++结构。我认为,最好的选择是树形结构(导致每个深层我们有几个可能的移动)。
这是一个好方法吗?
struct TreeElement{
SomeMoveType move;
TreeElement *parent;
std::vector<TreeElement*> children;
};
如何在文件中有效存储此类数据?有没有办法确保整个树结构将存储在内存的同一部分,这将允许使用mmap函数?
答案 0 :(得分:3)
要将数据存储在内存的同一部分中,您可能希望为您使用的std::vector<TreeElement *>
提供一个Allocator对象,并从您的块中进行分配。
为了能够序列化它,而不是存储实际指针,您可以考虑在块中存储偏移量。然后,当您重新读取数据时,可以将块的起始地址添加到每个偏移量,以将其重新转换为地址。
根据您使用的操作系统/编译器,可能已经有一些支持。例如,Microsoft的编译器支持__based
指针,这几乎就是我所描述的:一个基地址,每个基于该地址的指针实际上只是一个偏移量,而不是一个完整的指针。提到mmap
表示可能无法直接使用,但可能您正在使用的编译器/操作系统有类似的东西。否则,您可能必须自己完成这项工作(例如,使用based_pointer
课程。)
真正的问题是你为什么要尝试序列化移动树。在典型情况下,您最好只保存当前的电路板位置(或者,相当于移动历史记录),并在需要时重新生成移动树。这足够小,以至于它很容易存放。
答案 1 :(得分:0)
我认为使用std :: vector不是创建树的最佳方式,单链表样式树结构可能更简单,更好。