STL容器,创作/销毁速度

时间:2011-06-23 02:30:16

标签: c++ stl containers

背景 我正在为我的游戏引擎创建一个高效(有希望)的碰撞检测系统 - 当我在屏幕上放置大量物体时,它引入了一个小问题。我的问题是:

我将定期添加和删除对象,并且我有几个管理器类,可以在任何给定时间跟踪对象,这意味着很多从容器中添加和删除这些对象。我一直在使用矢量和deques,这很好,但是我非常希望升级系统的核心速度。

因此问题:哪个容器((STL与否)[最好是前者])给我最快(顺序无关紧要)添加,删除和随机访问元素?< / p>

我一直在想我将使用一个集合,我会迭代这些元素,但不会像我将使用其他三个函数那样频繁。

附加信息基本上我将我的屏幕拆分为未定义大小的网格,当一个对象移动时,我将找到左上角当前所在的方格,然后右下角(假设物体当然是方形的)因此我将知道物体占据的所有当前网格位置。当我进行碰撞检测时,我只会检查具有多个对象的网格位置,当我检查碰撞时它有望比我以前的系统快得多=]

2 个答案:

答案 0 :(得分:2)

std::set不太可能提供更好的性能:它是一个基于节点的容器,因此每个元素都需要动态分配,这可能会很昂贵。

考虑坚持使用std::vector:它提供对序列中所有元素的恒定随机访问,以及序列末尾的恒定时间插入和删除。

由于您说顺序无关紧要,您还可以通过从序列末尾移动元素以使其替换要删除的元素,从序列中间逐步删除任何元素。像这样的东西:

void remove_element(std::vector<Entity>& v, std::vector<Entity>::iterator it)
{
    std::vector<Entity>::iterator last_element_it = v.end() - 1;
    if (it != last_element_it) {
        using std::swap;
        swap(*it, *last_element_it);
    }
    v.erase(last_element_it);
}

答案 1 :(得分:1)

  

哪个容器((STL与否)[最好是前者])给我最快(顺序无关紧要)添加,删除和随机访问元素?

他们都不是。你必须选择你想要的东西。

最后添加std :: vector很快,从末尾删除。但是在其他任何地方插入/移除都会至少有些伤害。

无论在哪里,从std :: list中插入和删除都会非常快,但是没有随机访问。

std :: deque从开头到结尾都有std :: vector-like插入和删除,并且它具有随机访问权。

我的问题是:你经常需要随机访问碰撞对象列表吗?大部分操作都不会遍历列表(对于每个对象都执行X)吗?如果是这样,我会选择std :: list。

或者,您可以使用std :: map,其中map的键是某种唯一的实体ID。这将使您比std :: list更慢插入/删除(由于需要平衡的二叉树),但您将能够合理快速地通过标识符访问实体。这可能很重要。

在这方面,std :: map可能介于std :: vector / deque和std :: list之间。比列表更慢的插入/删除,比向量/双端队列更慢的随机访问,但你确实得到了两者。

话虽如此,我非常怀疑这种优化对您来说非常有用。你将拥有多少这些物品,可能只有几千个?你多久碰一次?您是否真的认为您使用的容器类型会在碰撞系统的性能中成为重要因素?

在使用容器为他们打扰之前,先优化碰撞算法。

相关问题