[英]Difference between list and forward_list performance?
與 c++11 一樣,我們有兩種類型的列表:
std::list<int> lst = { 1, 2, 3, 4, 5 };
std::forward_list<int> flst = { 5, 4, 3, 2, 1};
眾所周知,鏈表是基於雙向鏈表的,而 forward_list 是基於單鏈表的。
我們應該如何決定使用哪一個? 以上列表中的任何一個是否有任何性能優勢?
我們該如何決定使用哪一個?
確定是否需要雙向迭代。 如果前向迭代足夠好,請使用std::forward_list
,除非您需要支持比C ++ 11更早的C ++版本,這些版本可能只有std::list
。
其他列表中是否有任何性能優勢?
std::forward_list
消除了每個節點的指針(具有數據高速緩存和內存子系統的所有附帶好處),而std::list
提供了恆定時間迭代器減量。
但實際上,這些容器都沒有像人們在參加計算機科學學校時所認為的那樣廣泛使用。 std::vector
的真正性能對於許多應用程序來說都是優越的,並且它的內存使用率總是更低。 需要列表的要求更高的應用程序可以很好地考慮標准C ++不提供的侵入式列表。
除了john-zwinck所說的,如果您必須使用鏈表,請在做出決定時記住以下幾點:
由於其性質, std::forward_list
沒有在最后運行的修飾符函數:
push_back、pop_back、emplace_back
此外,根據std::list
, std::forward_list
不提供size
成員函數以提高效率。 std::list
size
函數通過 C++11 給出恆定時間內的元素數。 另一方面,它需要為內部計數器提供一些額外的存儲空間,這使得插入和移除的效率稍低。 為了獲得std::forward_list
的大小,距離算法可以與begin()
和end()
函數一起使用,但此操作需要線性時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.