我觉得这是一个非常简单,几乎是愚蠢的问题。我只是忘记了我应该知道该怎么做。
我有GameObjects,它们存储在一个通用的GameObjectManager中。这些GameObjects有一个ObjectID,它是一个简单的int。
我需要能够在基于2D图块的世界中插入或删除这些GameObjects,其中每个TILE都包含ObjectID的容器。
这样,我可以抓住一个特定的图块(例如Tile [10] [10])然后通过从容器中读取来查看Tile [10] [10]上的游戏对象。 (例如,“啊,所以字符#4302和项目#123在Tile [10] [10]上!”)
现在,每个“Tile”都是Tiles的MAP数组中的结构。
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
但是,我读到在任意添加/删除变量时不应使用Vectors。这不像我将删除数组中的第一个或最后一个变量。相反,我将不得不调用特定的ObjectID并将其从数组中的任何位置删除。
出于这个原因,我正在考虑使用不同的容器。 也许我太累了,但我可以使用一些关于使用什么容器的建议,以及如何去除容器中的SPECIFIC变量。
例如,GameObject的ObjectID为“422”。 Tile [2] [8]包含一个按顺序具有以下整数的容器:420,421,422,433,486,800。
我有一个函数:RemoveGameObjectFromMap(int ObjectID); 每当我输入(RemoveGameObjectFromMap(422);
)时,我都需要删除422我曾经使用MAP容器,但这是不必要的。根据cplusplus.com,矢量对此不利。
答案 0 :(得分:0)
向量是好还是坏取决于许多事情。就像每个图块(平均)有多少ID一样,插入,删除和查找的频率,最小化内存使用量需要多少,以及其他100个注意事项。简而言之,没有简单的答案。在这种情况下,std::vector
的显而易见的替代方法是std::unordered_set
(我假设您不会在同一个磁贴中多次使用相同的ID)。
答案 1 :(得分:0)
如果你要存储大约10-20个元素 - 使用矢量。特别是对于POD元素。我不确定std::unordered_set
但是map会给你很多内存分配,它会吞噬快速插入和擦除的任何速度提升。为了加快搜索速度,您可以对矢量进行排序并使用一些二分搜索(lower_bound upper_bound equal_range)。