1

我觉得这是一个非常简单,几乎是愚蠢的问题。我只是忘记了我应该知道该怎么做。

我有 GameObjects,它们存储在通用 GameObjectManager 中。这些游戏对象有一个 ObjectID,它是一个简单的 int。

我需要能够在基于 2D 瓦片的世界中插入或删除这些游戏对象,其中每个瓦片都包含一个 ObjectID 容器。

这样,我可以抓取一个特定的图块(例如 Tile[10][10]),然后通过从容器中读取来查看 Tile[10][10] 上的游戏对象。(例如“啊,所以 Character#4302 和 Item#123 在 Tile[10][10] 上!”)

现在,每个“Tile”都是 MAP 的 Tiles 数组中的一个结构。

 struct MapTile
 {
     std::vector <int> GameObject_MapList ; //list of Objects on this map location
    TileTerrainType tileTerrainType; //GFX to display Grass, Sand, Water, Swamp, etc.
 };

 MapTile mlMap[100][100]; //map array

但是,我读到在任意添加/删除变量时不应使用向量。我不会删除数组中的第一个或最后一个变量。相反,我将不得不调用特定的 ObjectID 并将其从数组中的任何位置删除。

出于这个原因,我正在考虑使用不同的容器。也许我太累了,但我可以就使用什么容器以及如何删除容器中的特定变量提出一些建议。

例如,GameObject 的 ObjectID 为“422”。Tile[2][8] 包含一个容器,该容器按顺序具有以下整数:420、421、422、433、486、800。

我有一个函数: RemoveGameObjectFromMap(int ObjectID); 所以我需要它来删除 422,每当我输入 (RemoveGameObjectFromMap(422);

我曾经使用 MAP 容器,但这是不必要的。根据 cplusplus.com 的说法,Vector 对此会不利。

4

2 回答 2

0

一个向量是好是坏取决于很多事情。就像每个图块有多少个 ID(平均),插入、删除和查找的频率,有多少需要最小化内存使用,以及 100 个其他考虑因素。简而言之,没有简单的答案。std::vector在这种情况下,明显的替代方案是std::unordered_set(我假设您永远不想在同一个图块中多次使用相同的 ID)。

于 2013-09-16T20:57:59.923 回答
0

如果您要存储大约 10-20 个元素 - 使用矢量。特别是对于 POD 元素。我不确定,std::unordered_set但 map 会给你很多内存分配,这将吞噬快速插入和擦除带来的任何速度提升。为了加快搜索速度,您可以对向量进行排序并使用一些二进制搜索(lower_bound upper_bound equal_range)。

于 2013-09-17T08:37:19.430 回答