我应该使用什么类型的容器来存储我的ObjectID整数?

时间:2013-09-16 20:46:56

标签: c++ list vector iteration containers

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

我有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,矢量对此不利。

2 个答案:

答案 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)。