嘿,我现在有一个结构列表,我每次使用std :: list排序方法添加新对象时都会对此列表进行排序。 我想知道什么会更快,使用std :: multimap为this或std :: list, 因为我每帧都在迭代整个列表(我正在制作游戏)。
我想听听你的意见,我应该为这次事件使用什么。
答案 0 :(得分:5)
std::multimap
可能会更快,因为每次插入时为O(log n),而列表的插入和排序为O(n log n)。
根据您的使用模式,您可能最好使用已排序的vector
。如果你一次插入一大堆项目,然后做一堆读取 - 即读取和写入不是交错的 - 那么你将使用vector
,std::sort
和std::binary_search
。
答案 1 :(得分:1)
您可以考虑使用lower_bound算法来查找列表中的插入位置。 http://stdcxx.apache.org/doc/stdlibref/lower-bound.html
编辑:根据Neil的评论,请注意这适用于任何序列容器(vector,deque等)
答案 2 :(得分:1)
如果您不需要键值/值对std::set
或std::multiset
可能比使用std::multimap
更好。
std::set
的参考:
http://www.cplusplus.com/reference/stl/set/
std::multiset
的参考:
http://www.cplusplus.com/reference/stl/multiset/
编辑:(之前似乎不清楚)
使用std::(multi)set
或std:(multi)map
之类的容器通常比使用std::list
更好,并在每次插入元素时对其进行排序,因为std::list
在插入时效果不佳容器中间的元素。
答案 3 :(得分:0)
一般来说,迭代容器可能需要花费大量时间来迭代另一个容器,所以如果你继续添加到容器然后迭代它,那么主要是选择一个容器来避免经常不得不重新分配内存并快速插入所需的方式。
list和multimap都可以避免仅仅通过添加元素来重新分配自己(就像你可以使用向量一样),所以它主要是插入需要多长时间的问题。添加到列表的末尾将是O(1),而添加到多图的将是O(log n)。但是,multimap将按排序顺序插入元素,而如果要对列表进行排序,则必须在O(n log n)中对列表进行排序,或者以排序方式插入元素像lower_bound这样的东西就是O(n)。在任何一种情况下,使用该列表都会更糟糕(至少在最坏的情况下)。
通常,如果您按照排序顺序维护容器并不断添加它而不是创建它并对其进行一次排序,那么集合和映射会更有效,因为它们的设计是为了排序。当然,与往常一样,如果您真的关心性能,分析您的特定应用程序并查看哪些更好用,那就是您需要做的事情。但是,在这种情况下,我会说几乎可以保证multimap会更快(特别是如果你有很多元素)。