对于经常创建和删除的游戏对象,我应该使用什么容器
What container should I use for the game objects that are created and deleted frequently?
我正在做一个游戏,我创建对象并经常杀死它们。我必须能够线性地循环对象列表,使下一个对象始终比上一个对象更新,因此对象的呈现是正确的(它们将重叠)。我还需要能够将每个对象的指针存储到四叉树中,以便快速找到附近的对象。
我的第一个想法是使用 std::list
,但我以前从未做过这样的事情,所以我正在寻找专家对此的想法。
我应该使用什么容器?
编辑:我不只是从前面删除:对象可以按任何顺序杀死,但它们总是添加到列表的末尾,所以最后一项是最新的。
std::vector 是当你不确定自己在做什么时推荐的容器。只有当你知道这对你不起作用时,你才应该选择别的东西。
也就是说,如果您定期添加到容器的背面并从前面删除,您可能需要 std::d eque。 [编辑]但似乎这不是你正在做的事情。
我想你可能想要两个容器,一个用于维护插入顺序,另一个用于您的四叉树。 互联网上有很多四叉树实现,所以我将重点介绍另一个。 按照您的建议使用 std::list 将使删除操作本身比矢量或 deque 更快。 它还具有允许您存储迭代器的优点,因为当元素被删除时,列表不会使其他迭代器失效。 四叉树中的对象可以在插入顺序列表中维护一个迭代器。 当你从四叉树中删除一个元素时,你也可以在 O(1) 时间内将其从列表中删除。
与往常一样,关于使用哪个容器的决定完全取决于权衡。 列表附带了对矢量的内存占用增加和连续内存布局的丢失。 当您的数据集很大时,您可能会惊讶于缓存位置的重要性。 确定的唯一方法是尝试各种容器,看看哪一个最适合您的应用程序。
我认为boost::stable_vector符合您对删除\迭代的需求。
因此,您希望能够按照添加项的顺序循环访问容器,但希望能够从容器中的任何点删除项。一个简单的queue
显然不会破解它。
令人高兴的是,有 4 个容器可以轻松完成这项工作, std::vector
、 std::list
和 std::deque
和 std::set
.如果您使用标准容器习语(例如。 begin
、end
、erase
、insert
,以及在较小程度上,push_front
、pop_back
、front
、back
)你可以使用任何你喜欢的容器。通过这 8 个操作,您可以在std::vector
、std::list
和std::deque
之间切换,并且仅使用前 4 个操作,您也可以使用 std::set
。编写代码,然后您可以轻松地在不同的容器类型之间进行切割和更改,并进行一些分析以比较性能和内存开销或其他内容。
直觉上,std::list
可能是一个不错的选择,也许std::set
也会起作用。但是,与其做出假设,不如使用模板库为您提供的通用工具,并在以后有一些有意义的性能数据可以使用时对其进行分析和优化。
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 我应该如何从函数返回对象?
- 我应该只在免费商店上为一次调用创建对象吗?
- 我应该如何在这个房间中创建一个新对象 - opengl
- 我应该如何声明我的对象才能正确使用这些函数
- 我应该返回引用堆对象还是返回值
- 我应该如何访问对象的成员变量
- QT:我应该如何动态地将信号路由到适当的对象
- QT:我应该使用哪个对象/项目创建可点击图标
- 我应该如何跟踪几个对象
- 我应该移至面向对象的编程(黑匣子)以及如何
- 在C++对象中:我应该使用父类强制转换指针,还是应该使用实际类本身进行强制转换
- 我应该如何编写用C++代码编写的Lua API/对象模型的文档
- 我应该使用什么函数签名来返回对可能不存在的对象的引用
- 当对象表示硬件组件时,我应该使用指向对象的指针吗
- 我应该创建一个临时对象来实例化C++中的成员变量吗
- 我应该用switch语句从变量创建C++模板化对象吗
- 我应该如何存储对象
- 对于经常创建和删除的游戏对象,我应该使用什么容器
- 我应该怎么做才能使用自定义类对象的 QVector 将信号发送到插槽