游戏树的C++实现
C++ implementation of game tree
我将把一个国际象棋游戏表示为C++结构。我认为,最好的选择是树形结构(因为在每个深度,我们都有几个可能的移动)。
这是一个好方法吗?
struct TreeElement{
SomeMoveType move;
TreeElement *parent;
std::vector<TreeElement*> children;
};
如何高效地将此类数据存储在文件中?有没有办法确保整个树结构将存储在内存的同一部分,从而允许使用mmap函数?
要将数据存储在内存的同一部分,您可能需要为所使用的std::vector<TreeElement *>
提供一个Allocator对象,并从块中进行分配。
为了能够序列化它,您可以考虑在块中存储偏移量,而不是存储实际的指针。然后,当您读取回数据时,您可以将块开始的地址添加到每个偏移量,以将其转换回地址。
根据您使用的操作系统/编译器,可能已经有一些对此的支持。例如,微软的编译器支持__based
指针,这正是我所描述的:一个基地址,基于该地址的每个指针实际上只是一个偏移量,而不是一个完整的指针。提到mmap
表明您可能无法直接使用它,但您使用的编译器/OS可能也有类似的功能。否则,您可能不得不自己完成这项工作(例如,使用based_pointer
类)。
真正的问题是你为什么要序列化一个移动树。在典型的情况下,最好只保存当前的董事会位置(或者,大约相当于移动历史),并在需要时从中重新生成移动树。它足够小,很容易储存。
我认为使用std::vector并不是创建树的最佳方式,单链表风格的树构造可能更简单、最好。
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 用于AVX的ln(x)的实现,m256
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在C++中,如何在类和函数(可能是模板化的)的头中编写完整的实现
- std::random_device是如何实现的