如何存储允许O(1)随机访问的3D地图? (C ++)

时间:2015-04-05 20:10:24

标签: c++ qt

我目前正在为Minecraft制作C ++客户端/机器人,我想知道我是否可以使用允许有效随机的数据结构来存储世界地图访问,使用STL或Qt库。

世界总是高256,但在x和z坐标上可以无限大。它被发送到包含16x256x16块的块的数据包中。 现在我将16x256x16部分中的块存储到数组中,因为大小永远不会改变,我将这些部分存储到stl映射中,使用成对中的x和z作为键。

问题是我目前正在处理人工智能,我需要经常访问地图,所以我想知道是否有更好的存储能来提高访问效率。我不关心添加或删除元素的效率。它也不需要排序。

2 个答案:

答案 0 :(得分:3)

你想使用STL std::unordered_map,它会给你O(1)

答案 1 :(得分:1)

如果你采用Qt方式,你可以使用QHash替代std::unordered_map,使用更方便的API。此外,QMultiHash如果在给定的坐标系下可能有多个对象。

您可以QHasht<Coord3d, Data>并撰写uint qHash(Coord3d)所需的QHash功能:

struct Coord3d {
  uint x, y, z;
};

uint qHash(Coord3d & c) {
  uint h = 0;
  uchar * p = (uchar*)&c;
  for (uint i = 0; i < sizeof(Coord3d); ++i)
    h = 31 * h + p[i];
  return h;
}

此外,如果你必须遍历相邻的块,可能值得额外的内存来保持指向所有相邻块的指针,这样你就不必查找它们了。您可以轻松地使用每个块的相邻块指针实现自己的查找。它可能比使用散列图更有益于AI,并且可以更快地执行路径查找等典型任务。