关于池对象的数据结构的建议

时间:2013-05-07 02:15:38

标签: arrays data-structures hashtable box2d pool

我正在我的基于box2d的游戏中实现一个简单的池系统来生成/ despawn / pre-pool所有对象。有问题的对象都是以设定半径创建的圆。例如当我预先游泳时,我会创建10 x 2米,5 x 5米,5 x 10米的圆圈。

现在我正在使用一个简单的链接列表来存储池化对象,所以当我需要获得半径为x的对象时,可能需要直到列表的末尾才能找到具有正确半径的主体,或者根本找不到它。这显然很麻烦,只会在我收集更多物品时变得更糟。

我正在考虑使用哈希表,所以我可以使用半径作为键来哈希并快速访问正确的对象,但我担心的是,半径值因使用它们的值和对象数量而有很大差异。例如我可能在2米处有50个哈希值,在100米处可能有5个哈希值,这会造成浪费空间的创建交易吗?

我在使用数据结构方面缺乏经验,我想了解更多,那么哪种类型的数据结构最有效地处理这样的系统以及为什么?

谢谢!

2 个答案:

答案 0 :(得分:0)

哈希表是解决此类问题的完美解决方案。你想要的是作为关键的直径和作为值的圆圈矢量。当一个带有新键的新项目被添加到表中时,应该构造一个新的向量来保存该值以及任何其他值。如果要将新项添加到表中,但它没有唯一键,请获取该键的现有向量并将新项添加到向量中。

这不会浪费空间。每个半径值都链接到一个包含该半径项的向量。关于“例如,我可能在2米处有50个哈希值,在100米处可能有5个哈希值,这会导致浪费空间的创建处理权利吗?”我不明白为什么这会是一个问题。如果您对此主题感兴趣,请查看通过链接解决冲突的哈希。

答案 1 :(得分:0)

使用半径作为键的std::multimap和对象作为值。它会为您提供log N搜索,插入和删除的复杂性。 http://www.cplusplus.com/reference/map/multimap/