簡體   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