繁体   English   中英

std :: list或std :: multimap

[英]std::list or std::multimap

嘿,我现在有一个我制作的结构的列表,每次添加新对象时,我都会使用std :: list sort方法对该列表进行排序。 我想知道使用std :: multimap或std :: list会更快,因为我要遍历每帧的整个列表(我正在制作游戏)。

我想听听您的意见,对于此事件我应该使用什么。

std::multimap可能会更快,因为每次插入为O(log n),而列表的插入和排序为O(n log n)。

根据您的使用模式,最好使用有序vector 如果您一次插入一大堆项目,然后进行一堆读取(即,读取和写入不交错),则使用vectorstd::sortstd::binary_search会有更好的性能。

您可能会考虑使用Lower_bound算法来查找要插入列表的位置。 http://stdcxx.apache.org/doc/stdlibref/lower-bound.html

编辑:根据尼尔的评论,请注意,这将与任何序列容器(矢量,双端队列等)一起使用。

如果不需要键/值对std::setstd::multiset可能比使用std::multimap更好。

std::set参考: http : //www.cplusplus.com/reference/stl/set/

std::multiset参考: http std::multiset

编辑:(似乎之前不清楚),通常最好使用std::(multi)setstd:(multi)map类的容器,而不是使用std::list并在每次插入元素后对其进行排序,因为std::list在将元素插入容器中间时效果不佳。

一般来说,在一个容器上进行迭代可能要花费与在另一个容器上进行迭代一样多的时间,因此,如果您继续添加一个容器然后对其进行迭代,则主要是选择一个容器的问题,这样可以避免不断地重新分配内存和快速插入您想要的方式。

list和multimap都将避免仅通过添加元素就可以重新分配自身(就像您可以通过vector获得的那样),因此这主要是插入需要花费多长时间的问题。 添加到列表的末尾将是O(1),而添加到多图的结果将是O(log n)。 但是,多图将按排序顺序插入元素,而如果要对列表进行排序,则必须以O(n log n)对列表进行排序,或者使用像lower_bound这样的值将是O(n)。 无论哪种情况,使用列表都将更加糟糕(至少在最坏的情况下)。

通常,如果要按排序顺序维护容器并不断添加而不是创建容器并对其进行一次排序,则集和映射将被设计为可排序的,因此效率更高。 当然,一如既往,如果您真的很在意性能,则需要对特定的应用程序进行性能分析并确定哪个效果更好。 但是,在这种情况下,我想说,这几乎可以保证多图会更快(尤其是如果您有很多元素的话)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM