对于经常创建和删除的游戏对象,我应该使用什么容器

What container should I use for the game objects that are created and deleted frequently?

本文关键字:我应该 对象 游戏 什么 删除 常创建 创建      更新时间:2023-10-16

我正在做一个游戏,我创建对象并经常杀死它们。我必须能够线性地循环对象列表,使下一个对象始终比上一个对象更新,因此对象的呈现是正确的(它们将重叠)。我还需要能够将每个对象的指针存储到四叉树中,以便快速找到附近的对象。

我的第一个想法是使用 std::list ,但我以前从未做过这样的事情,所以我正在寻找专家对此的想法。

我应该使用什么容器?

编辑:我不只是从前面删除:对象可以按任何顺序杀死,但它们总是添加到列表的末尾,所以最后一项是最新的。

std::vector 是当你不确定自己在做什么时推荐的容器。只有当你知道这对你不起作用时,你才应该选择别的东西。

也就是说,如果您定期添加到容器的背面并从前面删除,您可能需要 std::d eque。 [编辑]但似乎这不是你正在做的事情。

我想你可能想要两个容器,一个用于维护插入顺序,另一个用于您的四叉树。 互联网上有很多四叉树实现,所以我将重点介绍另一个。 按照您的建议使用 std::list 将使删除操作本身比矢量或 deque 更快。 它还具有允许您存储迭代器的优点,因为当元素被删除时,列表不会使其他迭代器失效。 四叉树中的对象可以在插入顺序列表中维护一个迭代器。 当你从四叉树中删除一个元素时,你也可以在 O(1) 时间内将其从列表中删除。

与往常一样,关于使用哪个容器的决定完全取决于权衡。 列表附带了对矢量的内存占用增加和连续内存布局的丢失。 当您的数据集很大时,您可能会惊讶于缓存位置的重要性。 确定的唯一方法是尝试各种容器,看看哪一个最适合您的应用程序。

我认为boost::stable_vector符合您对删除\迭代的需求。

因此,您希望能够按照添加项的顺序循环访问容器,但希望能够从容器中的任何点删除项。一个简单的queue显然不会破解它。

令人高兴的是,有 4 个容器可以轻松完成这项工作, std::vectorstd::liststd::dequestd::set .如果您使用标准容器习语(例如。 beginenderaseinsert,以及在较小程度上,push_frontpop_backfrontback)你可以使用任何你喜欢的容器。通过这 8 个操作,您可以在std::vectorstd::liststd::deque之间切换,并且仅使用前 4 个操作,您也可以使用 std::set 。编写代码,然后您可以轻松地在不同的容器类型之间进行切割和更改,并进行一些分析以比较性能和内存开销或其他内容。

直觉上,std::list可能是一个不错的选择,也许std::set也会起作用。但是,与其做出假设,不如使用模板库为您提供的通用工具,并在以后有一些有意义的性能数据可以使用时对其进行分析和优化。