Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这种情况下的双向数据结构_C++_Data Structures - Fatal编程技术网

C++ 这种情况下的双向数据结构

C++ 这种情况下的双向数据结构,c++,data-structures,C++,Data Structures,我正在研究我的游戏引擎的一小部分,想知道如何优化一些部分 情况很简单,如下所示: 我有一张Tiles的地图(存储在二维数组中)(~260k个Tile,但假设更多) 我有一个项的列表s,它们至少和最多都在一个磁贴中 磁贴在逻辑上可以包含无限量的项s 在游戏执行期间,许多项目s被连续创建,它们从自己的磁贴开始 每个项目不断地将其平铺更改为相邻项目之一(上、右、下、左) 到目前为止,每个项目都有一个对其实际磁贴的引用,我只保留了一个项目列表。 每次项目移动到相邻的磁贴时,我只需更新项目->磁贴=…

我正在研究我的游戏引擎的一小部分,想知道如何优化一些部分

情况很简单,如下所示:

  • 我有一张
    Tile
    s的地图(存储在二维数组中)(~260k个Tile,但假设更多)
  • 我有一个
    项的列表
    s,它们至少和最多都在一个磁贴中
  • 磁贴
    在逻辑上可以包含无限量的
    s
  • 在游戏执行期间,许多
    项目
    s被连续创建,它们从自己的
    磁贴开始
  • 每个
    项目
    不断地将其
    平铺
    更改为相邻项目之一(上、右、下、左)
到目前为止,每个
项目
都有一个对其实际
磁贴
的引用,我只保留了一个项目列表。 每次
项目
移动到相邻的磁贴时,我只需更新
项目->磁贴=…
,我很好。这很好,但它是单向的

在扩展引擎时,我意识到我必须多次查找一个磁贴中包含的所有项目,这实际上降低了性能(特别是在某些情况下,我必须逐个查找一系列磁贴的所有项目)

这意味着我希望找到一种适合查找特定
磁贴
的所有项的数据结构,比O(n)中的更好,但我希望在“从一个磁贴移动到另一个”阶段避免太多开销(现在只是分配一个指针,我希望避免在那里做很多操作,因为这非常频繁)

我正在考虑一种自定义数据结构,以利用项目总是移动到相邻单元的事实,但我目前正在黑暗中摸索!任何建议都将不胜感激,即使是棘手或神秘的方法。不幸的是,我不能浪费内存,所以需要一个很好的权衡


我在C++中用STL开发,但没有升力。(是的,我确实知道
multimap
,但我不满意,但如果我没有找到更好的方法,我会试试)

对我来说,我会将
std::vector
包装成矩阵类型(即对1d数组强制进行二维访问),这可以让你快速随机访问任何分幅(实现矩阵很简单)

使用

索引大小的向量

 vector_size=y_size*x_size;
然后,每个项都可以有一个std::vector项(如果一个tile的项数量是非常动态的,可能是一个deque),同样,这些是随机访问,包含的开销非常小

对于您的用例,我将远离间接容器

PS:如果你愿意,你可以用我的矩阵模板。

结构坐标{intx,y;};
struct Coordinate { int x, y; };
map<Coordinate, set<Item*>> tile_items;
地图项目;
这会将磁贴贴图上的坐标映射到指示该磁贴上的项目的项目指针集。您不需要为每个坐标输入一个条目,只需要实际包含项目的坐标。我知道你说过:

但我希望在“从一块瓷砖移动”中避免太多开销 进入另一个“阶段”


这种方法需要在这个阶段增加更多的开销。但是,你真的尝试过这样的事情,并确定这是一个问题吗?

< P>如果你真的认为每个瓷砖商店的物品会占用你太多的空间,那么考虑使用四叉树来存储物品。这允许您有效地获取磁贴上的所有项目,但将磁贴网格保留在适当的位置,以便项目移动。

磁贴地图已经是原始的二维指针,例如
磁贴地图[宽度][高度]
,因此我可以随机访问整个地图,但是我不想每个图块都有一个项目列表,因为这些项目是稀疏的,并且没有占据地图本身的一个大区域。这听起来像是糟糕的设计。首先去掉固定大小的数组,使用一个有合适接口的向量,然后通过在本地给它向量或任何东西,让
平铺
拥有它的项目。这不是一个糟糕的设计,整个世界都需要地图。每个磁贴都必须存在,不是因为该项目,而是因为许多其他事情。正如我所说,这只是引擎的一小部分:)是的,但是如果一个项目必须有一个
磁贴
,那么磁贴肯定应该拥有该项目。如果不使用空向量,它不会占用太多空间。
struct Coordinate { int x, y; };
map<Coordinate, set<Item*>> tile_items;