游戏树的C ++实现

时间:2012-02-19 15:18:49

标签: c++ tree

我将代表国际象棋游戏作为C ++结构。我认为,最好的选择是树形结构(导致每个深层我们有几个可能的移动)。

这是一个好方法吗?

struct TreeElement{
  SomeMoveType move;
  TreeElement *parent;
  std::vector<TreeElement*> children;
};

如何在文件中有效存储此类数据?有没有办法确保整个树结构将存储在内存的同一部分,这将允许使用mmap函数?

2 个答案:

答案 0 :(得分:3)

要将数据存储在内存的同一部分中,您可能希望为您使用的std::vector<TreeElement *>提供一个Allocator对象,并从您的块中进行分配。

为了能够序列化它,而不是存储实际指针,您可以考虑在块中存储偏移量。然后,当您重新读取数据时,可以将块的起始地址添加到每个偏移量,以将其重新转换为地址。

根据您使用的操作系统/编译器,可能已经有一些支持。例如,Microsoft的编译器支持__based指针,这几乎就是我所描述的:一个基地址,每个基于该地址的指针实际上只是一个偏移量,而不是一个完整的指针。提到mmap表示可能无法直接使用,但可能您正在使用的编译器/操作系统有类似的东西。否则,您可能必须自己完成这项工作(例如,使用based_pointer课程。)

真正的问题是你为什么要尝试序列化移动树。在典型情况下,您最好只保存当前的电路板位置(或者,相当于移动历史记录),并在需要时重新生成移动树。这足够小,以至于它很容易存放。

答案 1 :(得分:0)

我认为使用std :: vector不是创建树的最佳方式,单链表样式树结构可能更简单,更好。